====== 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]]