Big's Homepage
05.05.2024
Sonnenaufgang 03:41
Sonnenuntergang 18:32
Tageslänge 14:51
 
Wissen
Links
Fun
Freizeit
Region
Reisen
Buidl
Impressum
Datenschutz

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:
  1. Eine beliebige Verzeichnisliste zur Sicherung kann angeben kann
  2. Eine bestimmte Anzahl Versionen wird rolliert.
  3. Immer die älteste Version soll überschrieben werden.
  4. Aus Geschwindigkeitsgründen soll nur die jeweilige Version aktualisiert werden. (nicht vor Sicherung komplett löschen)
Anbei mal der Quellcode und das ganze Paket zum Download.
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
rundll32.exe url.dll,FileProtocolHandler "c:\windows\winnt.bmp"Führt die Datei mit der verknüpften Anwendung aus; wie Doppelklick im Windows Explorer
rundll32.exe advpack.dll,LaunchINFSection %windir%\INF\msmsgs.inf,BLC.RemoveMSN Messenger deinstallieren
rundll32.exe user32.dll, LockWorkStationComputer sperren
rundll32 printui.dll,PrintUIEntry /?Zeigt alle Optionen für printui.dll
Siehe auch: http://www.ss64.com/nt/rundll32.html & http://www.dx21.com
 
Andere nützliche Befehle
Mit Hilfe folgender Befehle kann man Geräte automatisch deaktivieren & aktivieren. WLAN Karten bringt man so z.B. zum Suchen nach Drahtlosnetzwerken.
devcon.exe hwids pci*Zeigt alle PCI Gerät mitsamt der Hardware ID an. (devcon.exe ggf. im Internet besorgen)
devcon disable "Hardware-ID"Deaktiviert das Gerät mit der angegebenen Hardware ID
devcon enable "Hardware-ID"Aktiviert das Gerät mit der angegebenen Hardware ID
diskpartZur Disk Partitionierung auf Kommandozeilenebene - Achtung, manch Optionen können gefährlich sein.
Links