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: 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 <DIR> . 01.03.2010 21:42 <DIR> .. 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 <DIR> . 01.03.2010 21:42 <DIR> .. 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