====== Batch ======
===== Pseudo-Funktionen =====
==== Aufbau ====
Mit Batch lässt sich eine primitive Form einer Funktion nachstellen. Dies sieht wie folgt aus:
@echo off
call :r
call :p %read%
pause
goto:eof
:p
echo %1
goto:eof
:r
set /p read=Eingabe:
goto:eof
Der Ablauf:
- call wird ausgeführt, zu Sprungpunkt :r
- :r liest wert von Tastatur ein uns speichert ihn in in die Variable "read".
- :r wird beendet mit goto:eof
- call wird ausgeführt, zu Sprungpunkt :p, übergeben wird die Variable read
- das erste Argument, welche dem Sprungpunkt über die Call-Funktion mitgegeben wird, wird ausgegeben
- :p wird beendet mit goto:eof
- pause wird ausgeführt
- batch-file wird beendet
==== Beispiele ====
=== sleep ===
**Beschreibung**:\\ \\
Mit sleep wird im Script eine Pause angelegt. Als Parameter wird eine Zahl benötigt, welche der Dauer der Pause entspricht.
**Funktion:**
goto:eof
:sleep
ping -n 1 -w %1000 192.0.2.0 >nul 2>&1
goto:eof
**Anwendung:**
call:sleep 5
IP-Adressse: [[https://tools.ietf.org/html/rfc5737|RFC5737]]
=== counter ===
**Beschreibung**:\\ \\
Will man innerhalb einer for-Schleife Zahlen zusammen Zählen, ist dies nur über eine Funktion möglich, da die Veränderung der Variable nur innerhalb der Schleife übernommen wird.
**Funktion:**
goto:eof
:Counter
set /a counter=%counter% + %1
goto:eof
**Anwendung:**
set counter=0
for /l %%a in (1,1,5) do call:Counter %%a
echo.%counter%
=== GetFolderSize ===
**Beschreibung**:\\ \\
Mit hauseigenen Tools lässt sich die Grösse eines Folder mit cmd.exe nicht ermitteln, es muss auf externe Tools zurückgegriffen werden, wie z.B. du.exe (Sysinternals), VBS, PowerShell. In der Beispiel-Funktion wird PowerShell verwendet.
**Funktion:**
goto:eof
:GetFolderSize
powershell "\"{0:N0}\" -f ((Get-ChildItem -Recurse -Force %1 | Measure-Object -Property Length -Sum).Sum / 1MB)"
goto:eof
**Anwendung:**
call:GetFolderSize C:\Windows\Temp
=== ExecPSQL ===
**Beschreibung**:\\ \\
Werden in einem Batch-File Daten aus einer PostgreSQL-Datenbank benötigt, kann der Funktion ExecPSQL das gewünschte Statement übergeben werden und diese liefert den Wert zurück.
**Funktion:**
goto:eof
:ExecPSQL
psql -h %SRV% -p %PRT% -U %USR% -d %DB% -A -t -c %1
goto:eof
**Anwendung:**
Vor dem Aufruf der Funktion müssen die Benötigten Variablen der DB gesetzt werden. Zudem wird die Path-Variable um den Pfad zum psql-Binary ergänzt (für x86 und AMD64).
set SRV=localhost
set PRT=5432
set USR=DBUser
set PW=DBPassword
set DB=DBName
set PGPASSWORD=%PW%
where psql.exe >nul 2>&1 || set PATH=%PATH%;C:\Program Files (x86)\PostgreSQL\bin;C:\Program Files\PostgreSQL\bin
call:ExecPSQL "SELECT COUNT(procpid) FROM pg_stat_activity"
===== Tipps =====
== Zugriff auf externe Tools ==
Wird in einem Batch-File ein externes Tool verwendet, muss dieses - sofern nicht über die PATH-Variable erreichbar - über den direkten Pfad aufgerufen werden.
Es gibt verschiedene Gründe, warum das Anpassen der PATH-Variable bevorzugt werden sollte.32-Bit-Software, welche sich in das ProgramFiles-Verzeichnis installiert, liegt bei 32-Bit-Systemen unter //C:\Program Files// und bei 64-Bit-Systemen unter //C:\Program Files (x86)//. Fügt man nun beide Pfade - auch wenn das eine Verzeichnis existiert - der Variable hinzu, entfällt das Auswerten der OS-Architektur.
wzzip.exe (WinZIP CLI):
where wzzip.exe >nul 2>&1 || set PATH=%PATH%;C:\Program Files (x86)\Winzip;C:\Program Files\Winzip
pg_dump.exe (PostgreSQL Dump):
where pg_dump.exe >nul 2>&1 || set PATH=%PATH%;C:\Program Files (x86)\PostgreSQL\bin;C:\Program Files\PostgreSQL\bin
== NAS Netzlaufwerk Sortierung mit dir ==
Wird ein Share eines NAS, wie zum Beispiel Q-NAP TS-210 als Netzlaufwerk gemappt, bemerkt man schnell, dass beim Ausführen von //dir// eine willkürliche Sortierung verwendet wird:
M:\Betontod\Schwarzes Blut>dir
Volume in drive M is MP3
Volume Serial Number is BD65-0021
Directory of M:\Betontod\Schwarzes Blut
09.12.2009 14:49 .
01.03.2010 21:42 ..
21.03.2010 12:26 3'644'186 09-Betontod - Vielleicht wird alles gut.mp3
21.03.2010 12:26 4'108'174 10-Betontod - Viva Punk!.mp3
21.03.2010 12:26 3'797'211 11-Betontod - Wind.mp3
21.03.2010 12:26 3'773'773 01-Betontod - Generation X.mp3
21.03.2010 12:26 6'164'432 07-Betontod - Kinder des Zorns.mp3
21.03.2010 12:26 2'546'439 08-Betontod - Im Sumpf des Verbrechens.mp3
21.03.2010 12:26 3'080'891 02-Betontod - Schwarzes Blut.mp3
21.03.2010 12:26 2'944'279 12-Betontod - All die Jahre.mp3
21.03.2010 12:26 3'870'026 06-Betontod - Glück auf.mp3
21.03.2010 12:26 3'132'548 05-Betontod - Zweifel.mp3
21.03.2010 12:26 3'229'667 03-Betontod - Feuer Frei!.mp3
21.03.2010 12:26 2'936'122 04-Betontod - Stillstand.mp3
12 File(s) 43'227'748 bytes
2 Dir(s) 174'093'758'464 bytes free
Mit dem Parameter ///o// wird eine Sortierung erzwungen. Will man jedoch nicht bei jedem dir-Command diesen Parameter anhängen, kann man diesen in der dircmd-Variable definieren:
set dircmd=/o
In folgendem Beispiel wird nochmals der Befehl //dir// ausgeführt, jedoch mit der zuvor definierten dircmd-Variable:
M:\Betontod\Schwarzes Blut>dir
Volume in drive M is MP3
Volume Serial Number is BD65-0021
Directory of M:\Betontod\Schwarzes Blut
09.12.2009 14:49 .
01.03.2010 21:42 ..
21.03.2010 12:26 3'773'773 01-Betontod - Generation X.mp3
21.03.2010 12:26 3'080'891 02-Betontod - Schwarzes Blut.mp3
21.03.2010 12:26 3'229'667 03-Betontod - Feuer Frei!.mp3
21.03.2010 12:26 2'936'122 04-Betontod - Stillstand.mp3
21.03.2010 12:26 3'132'548 05-Betontod - Zweifel.mp3
21.03.2010 12:26 3'870'026 06-Betontod - Glück auf.mp3
21.03.2010 12:26 6'164'432 07-Betontod - Kinder des Zorns.mp3
21.03.2010 12:26 2'546'439 08-Betontod - Im Sumpf des Verbrechens.mp3
21.03.2010 12:26 3'644'186 09-Betontod - Vielleicht wird alles gut.mp3
21.03.2010 12:26 4'108'174 10-Betontod - Viva Punk!.mp3
21.03.2010 12:26 3'797'211 11-Betontod - Wind.mp3
21.03.2010 12:26 2'944'279 12-Betontod - All die Jahre.mp3
12 File(s) 43'227'748 bytes
2 Dir(s) 174'093'758'464 bytes free
===== Links =====
* [[http://de.wikibooks.org/wiki/Batch-Programmierung:_Beispiele]]