Batch-Programmierung: Beispiele
[Bearbeiten] Regedit.exe
Eine kleine Batchdatei, um mit regedit.exe direkt einen bestimmten REG-Zweig anzuspringen:
set LastKey="HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Hotfix" set Key=HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Applets\Regedit reg add %Key% /f /v "LastKey" /d %LastKey% start regedit.exe
Erläuterung:
- LastKey ist der Reg-Schlüssel, der als Letztes angezeigt wurde und dieser wird beim Start von regedit direkt angesprungen, diesen Schlüssel kann man nach Belieben anpassen.
- Key ist der Reg-Schlüssel in dem sich der Wert "LastKey" befindet.
LastKey wird mittels reg add in die Registry eingespielt und danach wird regedit gestartet. Das Ganze funktioniert allerdings nur, wenn regedit.exe noch nicht läuft.
Und hier noch eine kleine Batchdatei, um mit regedit.exe Werte aus der Registry auszulesen:
set Key="HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Applets\Regedit" regedit.exe /e c:\temp\inhalt.reg %Key%
Achtung! Die Datei inhalt.reg ist im Unicode-Format. Ein Tipp dazu: Der type-Befehl kann Unicode lesen.
[Bearbeiten] TaskList-Abfrage
Eine Routine um das Laufen eines Prozesses mittels tasklist.exe festzustellen. In diesem Beispiel wird geprüft, ob Prozess.exe läuft.
@echo off set ProgEXE=Prozess.exe set tempdatei=%temp%\TempDatei.txt tasklist /FI "IMAGENAME eq %ProgEXE%" /FO CSV>%tempdatei% for /F "skip=2 tokens=1 delims=," %%f in (%tempdatei%) do ( echo gefiltert: [%%f] if "%%f"==""%ProgEXE%"" echo Prozess %ProgEXE% läuft goto ende ) echo Prozess %ProgEXE% läuft nicht! goto ende :ende del %tempdatei%
Alternativ, ohne obige temporäre Datei 'tempdatei' zu benötigen, kann man beispielsweise unter Windows XP folgendes verwenden:
TaskList /FI "IMAGENAME eq %ProgEXE%" 2>NUL | Find "%ProgEXE%" >NUL IF ERRORLEVEL == 1 ( ECHO NOT Running. GOTO Ende ) ELSE ( ECHO Running. GOTO Ende )
[Bearbeiten] Dienste einrichten
@echo off prompt -$G echo. echo ### Manuelle Dienste ### echo. call:M helpsvc "Hilfe und Support" call:M ImapiService "IMAPI-CD-Brenn-COM-Dienste" echo. echo ### nicht benötigte Dienste Deaktivieren ### echo. call:D cisvc "Indexdienst" call:D ERSvc "Fehlerberichterstattungsdienst" echo. echo ### Automatische Dienste ### echo. call:A CryptSvc "Kryptografiedienste call:A MSIServer "Windows Installer" echo. echo. echo Fertig! echo. pause goto:eof :A echo %2 auf Automatisch set Parameter=auto net start %1 goto machen :M echo %2 auf Manuell set Parameter=demand net stop %1 goto machen :D echo %2 auf Deaktiviert set Parameter=disabled net stop %1 goto machen rem Systemstart Gerätetreiber, der vom Startladeprogramm geladen wird. rem system Gerätetreiber start während der Kernelinitialisierung. rem auto automatischer start, nach systemstart, vor Benutzeranmeldung. rem demand Dienst, der manuell gestartet werden muss. rem disabled Dienst deaktivieren :machen echo on sc config %1 start= %Parameter% @echo off echo. echo. goto:eof
[Bearbeiten] Windows XP SP2: installierte Patches/Updates auflisten
Zeigt unter Windows XP mit Service Pack 2 alle zusätzlich installierten Patches/Updates an.
@echo off set RegHotfixListe=HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Hotfix set RegHotfixInfo=HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Updates\Windows XP\SP3 for /F "delims=\ tokens=7" %%f in ('reg query "%RegHotfixListe%"') do ( set HotFixNr=%%f CALL :Anzeigen ) echo. echo. pause goto:eof :Anzeigen reg query "%RegHotfixListe%\%HotFixNr%" /v Installed | FIND "0x1">NUL if "%errorlevel%"=="0" ( set installiert=ja call:KB_Info ) ELSE ( set installiert=nein ) echo %HotFixNr% - Ist Installiert: %installiert% if not "%InstalledBy%"=="" echo %HotFixNr% installiert von %InstalledBy% if not "%InstalledDate%"=="" echo %HotFixNr% am %InstalledDate% echo. goto:eof :KB_Info set InstalledBy= for /F "tokens=3" %%c in ('reg query "%RegHotfixInfo%\%HotFixNr%" /v InstalledBy 2^>NUL ^| FIND "InstalledBy"') do ( set InstalledBy=%%c ) set InstalledDate= for /F "tokens=3" %%c in ('reg query "%RegHotfixInfo%\%HotFixNr%" /v InstalledDate 2^>NUL ^| FIND "InstalledDate"') do ( set InstalledDate=%%c ) goto:eof
[Bearbeiten] Printdateien direkt an den Drucker senden
Sendet einzelne Druckdateien an im Netzwerk freigegebene Drucker. Eignet sich besonders bei Standard Drucksprachen wie Postscript und HPGL/2.
@echo off rem "pl.bat" sendet einzelne Druckdateien an bel. Drucker direkt. rem eignet sich besonders bei Standard Drucksprachen wie Postscript und HPGL/2. rem Laesst sich in Windows bequem einbinden, z.B rechte Maustaste - Senden an Plotter :voreingestellt set server=192.168.0.5 rem server --- IP von Printserver/oder Name von Freigaberechner --- set druckerbeschreibung=192.168.0.5 Freigabename EPSON rem druckerbeschreibung --- damit der Drucker leichter identifiziert werden kann --- set drucker=EPSONNT rem drucker --- das muss der Freigabename im Netzwerk/auf dem Freigaberechner sein --- if '%1' == 'drucker01' goto drucker01 if '%1' == 'drucker02' goto drucker02 if '%1' == 'canon' goto canon goto datei :drucker01 shift goto datei :drucker02 set server=42.1.1.240 set druckerbeschreibung=HP DJ 755CM im Sekretariat set drucker=hpdj755-tcp shift goto datei :canon set server=192.168.0.1 set druckerbeschreibung=Canon s/w Laser im EG set drucker=CanonLBP shift goto datei :datei if '%~1' == '' goto aufruf goto plot :plot echo. echo Dateiname : %1 echo Druckserver : %server% echo Freigabename: %drucker% echo Beschreibung: %druckerbeschreibung% echo. print /d:\\%server%\%drucker% '%~1' goto:eof :aufruf echo. echo aufruf : pl [plotter] Datei echo plotter : drucker01, drucker02, canon, (voreingestellt ist drucker01) echo.
Anmerkung zur Nutzung dieses Scriptes:
- Der Printbefehl schickt die Datei OHNE Interpretation direkt an den Drucker. Eine Bilddatei im JPEG-Format würde statt der Grafik also lediglich einen haufen wirrer Zeichen ergeben.
- Der Drucker muss in der Lage sein, selbst ASCII-Zeichen zu verarbeiten und aus zu geben. Dies ist bei älteren Druckern (vor ca. 1996 sicher) immer der Fall. Heute beherrschen meist nur noch PostScript-fähige Drucker diese Fähigkeit. "Billigen" GDI-Druckern muss man etwas auf die Sprünge helfen mit dem verwendeten "Druckprozessor" im Windows-Druckertreiber.
- Zum Umschalten zunächst die Druckerübersicht öffnen - Zu finden unter Start|Drucker und Faxgeräte
- Dann die Eigenschaften des gewünschten Druckers ausrufen (Rechtsklick|Eigenschaften)
- Auf dem Reiter "Erweitert" den Button "Druckprozessor..." klicken
- In dem erscheinenden Dialogfeld gibt es 2 Felder mit Einträgen. Im rechten Feld (Standartdatentypen) findet sich neben verschiedenen anderen auch der Eintrag "Text". Diesen markieren und dann alles mit OK wieder schließen.
Der Druckprozessor von Windows ist nun in der Lage, Ausgaben entsprechend zu Interpretieren und dem GDI-Drucker als Grafik zu liefern. Es können aber nur stur 80 Zeichen (maximal) auf ca. 60 Zeilen verteil werden. Manchmal sind es bis zu 66 Zeilen.
[Bearbeiten] Copy
Kopieren von Dateien.
Der Befehl
copy test.txt c:\temp
kopiert die Datei test.txt aus dem aktuellen Ordner in den Ordner c:\temp.
Der Befehl
copy c:\test.txt c:\temp
kopiert die Datei test.txt aus dem Ordner c:\ in den Ordner c:\temp
Datei- und Pfadnamen mit Sonderzeichen ( hier das Leerzeichen sowie ()[]{}^=;!'+,`~ ) müssen beim Copy=Kommando und den meisten anderen Kommandos in doppelten Anführungszeichen (") angegebenen werden, zum Beispiel:
copy f:\Beispiel.cmd "c:\Dokumente und Einstellungen\Siegfried\Eigene Dateien\"
Wie man sieht, kann man beide Schreibweisen mischen. Dagegen können sich mehrfach vorhandene Anführungszeichen wieder aufheben. Deshalb müssen vom Benutzer angegebene Anführungszeichen erst entfernt werden, bevor man in der eigenen Batchdatei neue setzt:
@echo off echo Kopiert eine Datei in das eigene Benutzerprofil. rem Die Anführungszeichen in der folgenden Zeile werden nur benötigt, rem damit zwischen dem Doppelpunkt und der Eingabe ein Abstand entsteht. set /p name="Bitte geben Sie einen Dateinamen an: " rem In der folgenden Zeile werden alle Anführungszeichen entfernt, da rem nach dem Gleichheitszeichen kein Ersattext folgt, siehe auch set/?. rem Das Set-Kommando kommt sowohl beim Variablennamen als auch beim rem Inhalt ohne Anführungszeichen aus. set name=%name:"=% rem An dieser Stelle sollte erst geprüft werden, ob die Datei überhaupt rem existiert, aber das würde den Rahmen hier sprengen. copy "%name%" "%HOMEDRIVE%%HOMEPATH%\Eigene Dateien"
Theoretisch könnte man auch mit den kurzen Dateinamen (8+3) arbeiten, aber diese sind nicht eindeutig und können von Laufwerk zu Laufwerk unterschiedlich sein. Daher besser nicht verwenden!
Kombiniert in der gegebenen Reihenfolge zwei oder mehrere durch "+" verbundene Textdateien in einer neuen Gesamtdatei.
In diesem Zusammenhang muss auf die Bedeutung der Parameter "/A" (für ASCII-Format, der Standardwert) und "/B" (für Binär-Format ) eingegangen werden, die jedem Dateinamen in obigem Beispiel mit einem Leerzeichen Abstand vorangehen können. DOS-Textdateien enthalten ein Dateiendezeichen (Dezimal 26, Hexadezimal 1A). Beim Kopiervorgang darf in der Gesamtdatei nur als letztes Zeichen ein Dateiendezeichen erscheinen, sonst würde der Text nach der ersten Endmarkierung nicht mehr angezeigt. "copy" kopiert ohne das abschließende Zeichen und fügt als letztes wieder eines zur Gesamtdatei hinzu.
Möchte man Dateien mit binären Inhalten zusammenfügen (z.B. PostScript-Dateien, die auch binäre Abschnitte enthalten können), so würde ohne Parameter "/B" ebenfalls nur bis zu einem zufällig vorkommenden Dateiendezeichen kopiert und damit das Ergebnis unbrauchbar.
copy /b "seite 1.ps" + /b "seite 2.ps" "Neue Datei.ps"
Als Zieldatei sollte man keine der Quelldateien verwenden, da möglicherweise sonst der Inhalt überschrieben wird.
[Bearbeiten] Message-Ping
Mit Hilfe des folgenden Scripts kann man Windows um eine nützliche Funktionalität erweitern. Mit Hilfe von mping erhält man eine Nachricht, sobald der gepingte Computer wieder erreichbar ist.
Um das Script global zu verwenden, muss es z.B. als "mping.cmd" in "Windows-Installationsordner\System32" gespeichert werden und kann von nun an z.B. mit "mping google.com" aufgerufen werden.
@echo off :: wenn kein remote Host angegeben ist, dann gehe zu :Syntax IF [%1]==[] GOTO Syntax IF [%1]==[/?] GOTO Syntax IF [%1]==[/h] GOTO Syntax IF [%1]==[/help] GOTO Syntax :mainloop :: pinge den Host 1 mal und leite die Ausgabe nach 'nul' um (keine sichtbare Ausgabe) ping %1 -n 1 >nul :: speichere den Errorlevel in die Variable 'status' set status=%errorlevel% :: sende eine Nachricht sobald der remote Host online ist if %status%==0 (msg %username% %1 online && exit 0) :: minimalistische Fortschrittsanzeige (Set /P i=.) < NUL :: sleep workaround (wer eine bessere, einfachere, genauere & universellere Möglichkeit kennt bitte korrigieren) :: pinge den lokalen Computer 10 mal ping localhost -n 10 >nul :: gehe zurück zum anfang goto mainloop :Syntax echo. echo Syntax: %~n0 [Hostname oder IP] echo. echo mping echo. echo Pingt einen offline Host und gibt eine Meldung echo aus, sobald er wieder online ist echo.
[Bearbeiten] Defrag mit Endlos-Schleife
Das eingebaute Defrag-Tool erlaubt ja immer nur die gleichzeitige Defragmentierung eines Laufwerks. Außerdem sind oftmals mehrere Durchgänge nötig, bis das Laufwerk wirklich vollständig defragmentiert ist. Mit dieser kleinen Batch Datei werden alle Partitionen immer wieder hintereinander defragmentiert. Wenn man wieder arbeiten will, kann man einfach das Eingabefenster schließen. Auch bei laufendem defrag passiert dabei nichts, weil defrag im Hintergrund die aktuelle Arbeit sauber beendet.
Damit aber nicht defekte Laufwerke einfach blind defragmentiert werden, habe ich eine etwas aufwendige Prozedur eingebaut, die die Laufwerke mit chkdsk erst überprüft. Wenn dabei ein Fehler auftritt, wird mit fsutil das dirty Bit gesetzt. Das bewirkt, dass beim nächsten Systemstart die Fehler behoben werden. Außerdem werden die Partitionen in dem loop ausgelassen, welche schon als dirty markiert sind.
Eine kleine Routine war auch nötig, damit Netzwerklaufwerke ausgelassen werden.
@echo off cd /d C:\ :loop for %%i in (c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z) do ( if exist %%i:\NUL call:defrag %%i ) echo. echo pause... ping localhost -n 10 >NUL goto loop :defrag call:check %1 if "%ok%"=="nein" ( echo Laufwerk %1: wird ausgelassen echo. goto:eof ) echo. echo. echo chkdsk %1: /v chkdsk %1: if %errorlevel% NEQ 0 ( if %errorlevel% NEQ 2 ( echo %1: chkdsk Fehler!!! echo Errorlevel: %errorlevel% echo. echo setzte dirty-Bit: fsutil dirty set %1: echo. echo Versuche Reparatur chkdsk %1: /v /x if %errorlevel% EQU 2 ( echo Fehler bereinigt! ) else ( echo Errorlevel: %errorlevel% echo. goto:eof ) ) ) echo defrag %1: -f defrag %1: -f if %errorlevel% NEQ 0 ( pause exit ) rem pause... ping localhost -n 1 >NUL goto:eof :check set ok=nein net use | find /i "%1:" >NUL if not errorlevel 1 ( echo %1: ist ein Netzlaufwerk goto:eof ) fsutil dirty query %1: for /F "tokens=5" %%f in ('fsutil dirty query %1:') do ( if not "%%f"=="NICHT" ( rem Laufwerk ist als fehlerhaft markiert goto:eof ) ) set ok=ja goto:eof
Als Alternative gibt es das Open Source Program JkDefrag, welches auch alle Laufwerke nacheinander defragmentiert.
[Bearbeiten] Dateiinformationen anzeigen
Dieses Batch-Skript zeigt Informationen über die Datei, die als Parameter übergeben wird, an. (beispielsweise per Drag&Drop auf die Batch-Datei)
@echo off echo Attribute...................: %~a1 echo Laufwerk....................: %~d1 echo kompletter Pfad.............: %~f1 echo Dateiname...................: %~n1 echo Ordnerpfad..................: %~p1 echo kompletter Pfad (kurze Form): %~s1 echo Aenderungsdatum.............: %~t1 echo Dateierweiterung............: %~x1 echo Dateigroesse................: %~z1 pause
Hinweis: Falls die Attribute des eigenen Batch-Skripts ausgelesen werden sollen, so muss der Parameter Null verwendet werden (Beispielsweise %~p0). Eine Kombination ist auch möglich, z.B: %~dp0 (Laufwerk + Pfad)
[Bearbeiten] Alle verfügbaren PCs im aktuellen Netzwerk suchen
Dieses Batch-Skript pingt alle IP-Adressen eines IP-Bereichs an und zeigt dann die PCs an, die verfügbar sind.
@echo off if exist ips.txt del ips.txt > nul echo Bitte geben Sie den ersten Teil der IP ein: set /p ip= for /L %%N IN (1, 1, 255) DO ( echo Die IP: %ip%%%N wird nun angepingt ping %ip%%%N -n 1 -w 1 | find "TTL" && echo %ip%%%N >> ips.txt ) cls type ips.txt pause >nul
Hinweis: Die Datei ips.txt wird nicht gelöscht, damit man sie für weitere Zwecke benutzen kann.
[Bearbeiten] Hosts Datei mit einem Aliasnamen und der aktuellen IP-Adresse aktualisieren
Häufig werden Webserver oder ähnliche Programme unter Angabe eines Aliasnamens installiert, damit sie leicht auf einen anderen Rechner verschoben werden können, falls der ursprüngliche Rechner defekt ist. Oder die Aplikationläuft unter VM-Ware auf einen Laptop bei dem sich die IP-Adressen häufig ändern. Dann kann mit dem Skript der Hostnamenalias mit der aktuellen IP-Adresse aktualisiert werden. Idealerweise wird das Script automatisch beim Start von Windows oder beim Anmelden des Anwenders ausgeführt.
@echo off set HOST_ALIAS=myserver myserver.mydomain.org set HOST_FILE=%SystemRoot%\System32\drivers\etc\hosts set TEMP_FILE=%TEMP%\hosts.tmp REM vorhandenen Eintrag entfernen und den Rest in TEMP-Datei schreiben type %HOST_FILE% | find /v "myserver" > %TEMP_FILE% REM Neuen Eintrag wieder hinzufügen for /F "tokens=15" %%i in ('ipconfig ^| find "IP Ad"') do set IP=%%i echo %IP% %HOST_ALIAS%>>%TEMP_FILE% echo ## Added %IP% %HOST_ALIAS% to the hostsfile REM Temp-File nach %SystemRoot%\System32\drivers\etc\hosts kopieren REM Die Datei Hosts darf nicht mit "move" verschoben werde, sondern muss kopiert werden, da sonst der Hostname nicht gefunden werden kann. copy /y %TEMP_FILE% %HOST_FILE% del /F /Q %TEMP_FILE%
[Bearbeiten] Windowsversion herausfinden
Mit dieser Batchdatei findet man heraus, welche Windowsversion verwendet wird. Das ist nützlich, wenn man mit bestimmten Pfaden arbeitet, die je nach Betriebssystem verschieden sind. Hier wird das Ergebnis mithilfe einer VBScript MsgBox ausgegeben.
@echo off VER |find /i "Windows 95" >NUL IF NOT ERRORLEVEL 1 GOTO 9598ME VER |find /i "Windows 98" >NUL IF NOT ERRORLEVEL 1 GOTO 9598ME VER |find /i "Windows Millennium" >NUL IF NOT ERRORLEVEL 1 GOTO 9598ME VER | find "XP" > nul IF %errorlevel% EQU 0 GOTO XP VER | find "2000" > nul IF %errorlevel% EQU 0 GOTO 2000 VER | find "NT" > nul IF %errorlevel% EQU 0 GOTO NT VER | find "Microsoft Windows [Version 6.1" > nul IF %errorlevel% EQU 0 GOTO Sieben VER | find "Microsoft Windows [Version 6" > nul IF %errorlevel% EQU 0 GOTO Vista VER | find "Microsoft Windows [Version 5" > nul IF %errorlevel% EQU 0 GOTO 2003 goto unknown goto end :unknown echo MsgBox "Betriebssystem unbekannt", VbInformation + VbOKOnly, "Ihr Betriebssystem" >%TEMP%\os.vbs goto end :9598ME echo MsgBox "Sie haben 95, 98 oder ME", VbInformation + VbOKOnly, "Ihr Betriebssystem" >%TEMP%\os.vbs goto end :NT echo MsgBox "Sie haben Windows NT", VbInformation + VbOKOnly, "Ihr Betriebssystem" >%TEMP%\os.vbs goto end :2003 echo MsgBox "Sie haben Windows 2003", VbInformation + VbOKOnly, "Ihr Betriebssystem" >%TEMP%\os.vbs goto end :2000 echo MsgBox "Sie haben Windows 2000", VbInformation + VbOKOnly, "Ihr Betriebssystem" >%TEMP%\os.vbs goto end :XP echo MsgBox "Sie haben Windows XP", VbInformation + VbOKOnly, "Ihr Betriebssystem" >%TEMP%\os.vbs goto end :Vista echo MsgBox "Sie haben Windows Vista oder Windows 7 RC", VbInformation + VbOKOnly, "Ihr Betriebssystem" >%TEMP%\os.vbs goto end :Sieben echo MsgBox "Sie haben Windows 7 ", VbInformation + VbOKOnly, "Ihr Betriebssystem" >%TEMP%\os.vbs goto end :end START %TEMP%\os.vbs
[Bearbeiten] TEMP-Verzeichnis löschen
Im %TEMP%-Verzeichnis sammeln sich mit der Zeit viele Dateien und Unterverzeichnisse an. Mit diesem Skript werden alle auf einmal gelöscht:
@echo off call:clean %TEMP% IF NOT "%TEMP%" == "%TMP%" ( call:clean %TMP% ) pause goto:eof :clean del /q "%~1\*.*" FOR /D %%D IN ("%~1\*") DO ( rmdir /s /q "%%D" ) goto:eof
(Wahrscheinlich erhält man ein paar Fehler, wenn z.B. Dateien geöffnet sind)
- Neue Version
Eine Version für Win XP/2000/WinVista/Win7
Echo off del /f /s /q "%HOMEPATH%\Lokale Einstellungen\Temp\*.*" del /f /s /q "%HOMEPATH%\Lokale Einstellungen\Temporary Internet Files\*.*" del /f /s /q "%HOMEPATH%\Lokale Einstellungen\Verlauf\*.*" del /f /s /q "%windir%\Temp\*.*" del /f /s /q "%windir%\Prefetch\*.*" del /f /s /q "%windir%\Temp\*.*" rmdir /s /q "%HOMEPATH%\Lokale Einstellungen\Temp\" rmdir /s /q "%windir%\Prefetch\" diskperf -n ipconfig /flushdns
Einfach den Text kopieren in eine Textdadei und zur .bat machen.