|
Batch me if you can... |
||||||||||||
Batch bedeutet eigentlich nur Stapel.
Damit ist gemeint
man kann einen Stapel von Befehlen mit Hilfe einer solchen
'Stapeldatei' ausführen. Diese Scripts erweisen sich als sehr nützlich wenn bestimmte Abfolgen von Befehlen häufig benötigt werden. Es werden keine hohen Vorrausetzung gefordert. Selbst Win95 konnte schon mit Batchdateien umgehen. | ||||||||||||
Beispiele | ||||||||||||
Zweites Programm mitstarten Beim Programmstart ein zweites Programm mitstarten - aber nur wenn es noch nicht gestartet ist... Im folgenden Beispiel wird mit dem Befehl pslist eine Liste aller Prozesse ausgegeben und auf einen Prozess mit dem Namen winlirc überprüft. Falls winlirc (IR-Fernbedienungssoftware) noch nicht gestartet ist wird diese Anwendung gestartet. Anschließend kann dann die TV Software gestartet werden. @echo off pslist|find "winlirc" if %errorlevel%==1 start C:\Programme\WinLIRC\ts_winlirc.exe start C:\Programme\ProgDVB\ProgDVB.exe exit Für denn Fall das man ein Programm nur einmal starten will, funktioniert auch folgendes: tasklist|find /I "notepad"||"%windir%\notepad.exe" find /I bewirkt das die Groß/Kleinschreibung des Prozesses ignoriert wird Die Funktionsweise von || ist weiter unten genauer erklärt (Auf Errorlevel reagieren) Zeilenumbruch unterdrücken Manchmal ist es nützlich Ausgaben nicht in separate Zeilen zu schreiben. Z.B. wenn man in einer Schleife zuerst den Rechnername, dann die Information ausgeben will. Das ganze kann dann in einer CSV Datei gespeichert werden. (Achtung früher war Komma (,) das Trennzeichen, ab Office 2003 ist es das Semikolon (;)) @echo off <nul set/p i=Rechnername, echo Information pause Dateiname ändern - z.B. Titel und Interpret aller MP3 Dateien in einem Verzeichnis tauschen Die Befehle setlocal / endlocal sind nützlich, da damit die Variablen nur temporär (während der Scriptausführung) gesetzt werden. @echo off setlocal for /F "delims=- tokens=1,*" %%i in ('dir /b *-*.mp3') do call :loop "%%i" "%%j" "%%i-%%j" goto fertig :loop set Part1=%1 set Part1=%Part1:~1,-2% set Part2=%2 set Part2=%Part2:~2,-5% ren %3 "%part2% - %part1%.mp3" goto :eof :fertig endlocal Für den Anfang mal bei Windows die Kommandzeile öffnen (Start \ Ausführen \ cmd bei älteren Versionen anstatt cmd command) Und mal ein paar Befehle durchprobieren - die meisten geben mit dem Prameter /? eine kleine Hilfe aus: cd dir - mal ansehen: dir /? c: set for goto @echo off - für die erste Zeile in Batch Files Batch Files haben die Endung .bat oder .cmd | ||||||||||||
Auf Errorlevel
reagieren: Bei einem Fehler (errorlevel > 0) einen Befehl ausführen: dir *.exe > nul || echo Keine EXE-Datei gefunden Nur wenn kein Fehler auftritt (errorlevel = 0) einen Befehl ausführen: dir *.exe > nul && echo Es wurde eine EXE-Datei gefunden -- Und wenn man den Errorlevel mal gar nicht brauchen will und den Errorlevel auf Null zurücksetzen will: ping -n 1 localhost > nul | ||||||||||||
Feststellen ob der
aktuelle
Benutzer lokale Administratorrechte hat - Bin ich Admin? (bei Windows
XP) Was sich auf den ersten Blick ziemlich einfach anhört kann in größeren Netzwerken zum Problem werden. Erst mal zur einfachen Variante. Wir müssen nur feststellen ob der aktuell angemeldete Benutzer in der Gruppe Administratoren vorkommt. net localgroup administratoren|find "%Username%" && echo Benutzer hat Adminrechte So schön sich das auch anhört, die Funktion nutzt wenig, falls z.B. der Benutzer Stefan keine Rechte hat, aber der Benutzer Stefanie Administrator Rechte hat. Es existieren allerdings Befehle wie IFMEMBER mit denen man dies noch ausschließen könnte. Bei größeren Netzen kommt es vor das die Benutzerkonten in zentralen Administrationgruppen aufgeführt sind und diese zentralen Administratorgruppen dann in den lokalen Administratorgruppen eingetragen sind. Da wird es dann schwierig. Es ist hier wohl sinnvoller auszuprobieren ob der Benutzer etwas darf oder nicht... Folgender Befehl test ob eein bestimmter Registry Schlüssel abgefragt werden darf: reg query HKU\S-1-5-19 > nul 2> nul && echo Ich bin Admin Der Registry Key gehört zu einem Betriebssystem interner Benutzer (LocalService) der nur mit Administratorrechten angezeigt werden kann. Der Teil > nul 2> nul dient nur dazu dass keine Ausgaben erfolgen. | ||||||||||||
Eine Liste von Rechner anpingen
(Online Checker) Mit Hilfe diesen Tools kann man eine Liste von Rechner anpingen und dadurch feststellen ob diese erreichbar sind. Hier der Quellcode: @echo off :: Testet eine Liste von Rechner ob sie online sind (pingbar) set CurrentPath=%~dp0 set CheckList=liste.txt echo *** Start: %date% %time:~,8% for /F "tokens=*" %%i in (%CheckList%) do ( <nul (set /p z=%%i: ) ping -n 1 %%i | find "TTL=" > nul || (echo %%i nicht erreichbar! & color cf) ping -n 1 %%i | find "TTL=" ) echo *** Ende: %date% %time:~,8% ping -n 5 localhost >nul pause Wie man sieht ist noch eine Textdatei liste.txt nötig. In dieser steht in jeder Zeile ein Rechnername. Falls ein Rechner in der Liste nicht erreichbar ist, färbt sich der Hintergrund rot. | ||||||||||||
Datensicherung in
mehreren
Versionen Ziel dieses Scripts ist die Datensicherung zu automatisieren. Folgende Anforderungen sollten erfüllt werden:
Ich übernehme keine Haftung für die Funktion! Achtung, im Zielpfad (BackupPath) werden Daten überschrieben/gelöscht! Hier der Quellcode der Datensicherungsroutine: @echo off :: Saver - Automatisierte Datensicherung :: Stefan Bigerl, www.bigerl.de set maxver=4 set BackupPath=c:\backup set CurrentPath=%~dp0 :: Genug *.ver Dateien vorhanden? for /L %%H IN (1,1,%maxver%) DO ( IF not exist %CurrentPath%ver\%%H.ver echo empty > %CurrentPath%ver\%%H.ver ) :: Suche älteste *.ver Datei for /F %%i in ('dir %CurrentPath%ver\*.ver /b /o-d') do ( echo set oldest_ver=%%i > %CurrentPath%ver\oldest_ver.cmd ) call %CurrentPath%ver\oldest_ver.cmd del %CurrentPath%ver\oldest_ver.cmd set oldest_ver=%oldest_ver:.ver =% echo Found oldest saver version: %oldest_ver% for /F "delims=" %%i in (%CurrentPath%sources.txt) do call :loop "%%i" goto Ende :loop echo Saving %1 IF not exist %1 ( color cf echo Achtung! Quellpfad %1 ungueltig! goto :eof ) set destpath=%1 set destpath=%destpath::\=_% set destpath=%destpath:"=% robocopy %1 "%BackupPath%\%oldest_ver%\%destpath%" /mir /np /log+:%CurrentPath%backup_log.txt > nul echo %date:~6,4%-%date:~3,2%-%date:~0,2%_%time:~0,2%-%time:~3,2%-%time:~6,2%-%time:~9,5% > %CurrentPath%ver\%oldest_ver%.ver goto :eof :Ende Hier das komplette Paket zum Download: dat_sich.zip | ||||||||||||
Ausgabe der Batch Eigenschaften | ||||||||||||
:: Hier ein Batchscript um die wichtigsten Batcheigenschaften anzeigen: @echo off echo Attribute: %~a0 echo Laufwerk: %~d0 echo kompletter Pfad: %~f0 echo Dateiname: %~n0 echo Ordnerpfad: %~p0 echo kompletter Pfad: %~s0 echo Aenderungsdatum: %~t0 echo Dateierweiterung: %~x0 echo Dateigroesse: %~z0 pause | ||||||||||||
Nützliche Befehle mit rundll32 | ||||||||||||
| ||||||||||||
Andere nützliche Befehle | ||||||||||||
| ||||||||||||
Links | ||||||||||||
|