Ablauf Schleifen und Sprungmarken batch datei: loop goto
Sprungmarken:
Beispiel:
@echo off
goto springe
echo hallo
:springe
echo gesprungen
pause
Ausgabe: gesprungen (echo hallo wird ignoriert, da mit dem Befehl "goto springe" die Zeile "echo hallo" übersprungen wird)
TEST: existiert eine Datei?
if exist %datei.txt
Beispiel:
@echo off
if exist %datei.txt goto existiert
echo Datei nicht gefunden!
goto ENDE
:existiert
echo die Datei existiert!
:ENDE
pause
Ausgabe: wenn die Datei datei.txt existiert: "die Datei existiert!" wenn die Datei datei.txt nicht existiert: "Datei nicht gefunden!"
Errorlevel:
jeder Befehl gibt bestimmte errorlevel zurück:
meist bedeutet der errorlevel 1, dass der Befehl nicht erfolgreich war:
Beispiel:
@echo off
xcopy c:\so c:\so2
if errorlevel 1 goto error
goto ende
:error
echo das kopieren war nicht erfolgreich!
:ende
pause
in diesem Beispiel wird das Verzeichnis c:\so in c:\so2 kopiert,
wenn jetzt z.B. so nicht existiert, schreibt die Batch-Datei: "das kopieren war nicht erfolgreich!"
for Schleife
For %%f In (c:\batch\*.bat c:\bat\*.bat) Do Copy %%f
Erklärung: diese Zeile kopiert alle Dateien im Ordner c:\batch mit Dateiendung .bat nach c:\bat
der Zähler kann auch so aussehen:
for /l %i in (1,1,100) do echo %i
bedeutet: beginnend von 1 in 1er Schritte bis 100; ausgeführt wird echo %i (%i ist die fortlaufende Nummer)
siehe auch: cmd Befehl mehrfach
if
if "alle"=="%1" del *.tmp
Erklärung: %1 ist eine, beim Aufruf auf an die Batch-Datei, angehängte Variable:
z.B. batchdatei.cmd Variable. Wenn also in diesem Beispiel an die Batchdatei "alle" angehängt wird: batchdatei.cmd alle, dann werden alle Dateien mit Endung .tmp aus dem aktuellen Verzeichnis gelöscht.
möglich wäre auch eine Abfrage mit if not 1==2 ... (also wenn 1 nicht 2 ist, stimmt in diesem Fall)
warte auf Task
:LOOP
echo in der Schleife
@ping -n 10 localhost> nul
TaskList|Find "Taskname" >NUL || If Errorlevel 1 Goto WEITER
Goto LOOP
:WEITER
Erklärung:
mit "@ping -n 10 localhost> nul" wird in der Schleife 10 Sekunden gewartet,
die Befehlszeile "TaskList|Find "Taskname" >NUL || If Errorlevel 1 Goto WEITER" verlässt die Schleife erst, wenn der Task: "Taskname" nich mehr läuft
weiterführende Themen
- Einführung, Grundlagen und erweitertes Wissen zu Windows Batch, siehe: Windows Batch.
- Der aktuelle Kommandozeileninterpreter, siehe: Windows PowerShell
{{percentage}} % positiv
DANKE für deine Bewertung!
Fragen / Kommentare
(sortiert nach Bewertung / Datum) [alle Kommentare(neueste zuerst)]
User: Anonym ich möchte überprüfen, ob in den letzten 24 eine neue "XY.zip" Datei im Ordner X abgelegt wurde, wenn ja entpacke nach XY im selben Ordner. ( Im Ordner X liegen bereits weitere .zip-Dateien, die bereits entpackt wurden. Ist exist der richtige Ansatz hierfür? wie muss der Befehl aussehen? ich komme nicht mehr weiter. Danke für jede Hilfe :)
User: Delphis1982 Hier mal eine Batch, die beim Starten von Windows VOR der Anmeldung solange wartet, bis ERSTENS: die Netzwerkfreigabe erreichbar ist und ZWEITENS: bis das iSCSI-Laufwerk D: eingebunden ist (da darin der Desktop liegt). Erst wenn BEIDE Bedingungen erfüllt sind, erfolgt die Anmeldung. In der Batch müssen also eigentlich nur ZWEI Bedingungen erfüllt werden, aber in der Batch sind DREI "if"-Abfragen. Je nachdem, welche Bedingung in LOOP1 zuerst erfüllt wird, wird der Zähler "t3" um 1 reduziert, springt springt dann zu LOOP2 oder LOOP3 und wartet dann, bis auch die jeweils andere Bedingung erfüllt wurde, dann wird der Zähler "t3" nochmal um 1 reduziert. In allen LOOP-Abschnitten wird immer wieder der Zähler abgefragt. Sobald dieser 0 erreicht hat, heißt es dann einfach EXIT und der Desktop wird geladen. :START @echo off set /a t1=20 set /a t2=20 set /a t3=2 :LOOP1 cls echo Noch %t1% Versuche... if exist \\SERVER-PC\ShareFolder goto LOOP2 if exist D:\NUL goto LOOP3 if %t1%==0 goto EXIT timeout /t 2 set /a t1=t1-1 goto LOOP1 :LOOP2 cls echo Noch %t2% Versuche... if exist D:\NUL goto EXIT if %t2%==0 goto EXIT timeout /t 2 set /a t2=t2-1 goto LOOP2 :LOOP3 cls echo Noch %t3% Versuche... if exist \\SERVER\ShareFolder goto EXIT if %t3%==0 goto EXIT timeout /t 2 set /a t3=t3-1 goto LOOP3 :EXIT set t1= set t2= set t3= exit
User: Lexor Warum für das Warten nicht @timeout nutzen?
gute Frage. Der Grund ist, dass timeout nicht immer Teil des OS war und du hast Recht mit Windows 10 ist timeout schöner.
Beitrag erstellt von Bernhard
User: AAxx19 Besteht die Möglichkeit mit einem Scriptbefehl den Download auf max. 5 zu begrenzen? :download ping /n 9 localhost >nul echo/ if %myprogrammist2% EQU 998 goto nomyprogramm echo **************************************** echo * * if %myprogrammist2% GTR 999 ( echo * myprogramm Update from %myprogrammist2% * ) else ( echo * myprogramm Update from %myprogrammist2% * ) set /a cat=%myprogrammist2% :loopb set /a cat=%cat%+1 wget --spider -o download http://myhomepage/update/myprogramm/%versiondir%/ETW2%cat%%version%.exe findstr /m "Length:" download if %errorlevel%==1 ( echo * myprogramm complete * echo * * echo **************************************** goto ETW3 ) else ( if exist %drv%\SYLT\ETW2\Update\ETW2%cat%%version%.exe ( goto loopb ) else ( wget.exe -q -c http://myhomepage/update/myprogramm/%versiondir%/ETW2%cat%%version%.exe -P %drv%\SYLT\ETW2\Update ) ) if %cat% lss 1100 goto loopb
User: Bashi Hi! Ich versuche eine .bat zu schreiben die solange versucht sich mit einem bestimmten Wlan Profil zu verbinden, bis die Verbindung hergestellt wurde, wie würde die if bedingung da aussehen?
User: Daniel if exist %datei.txt goto existiert Was sagt das Prozentzeichen aus ?
User: m Anstatt :ENDE am schluss zu schreiben und dorthin zu springen, kann mann auch 'exit' oder 'goto :eof' (Bedeuted warscheinlich 'end of file') schreiben um das program zu beenden.
User: paxi und fixi Ping -n 11 localhost braucht man doch für ne 10 sekunden pause muss ja immer ne sekunde dazugezählt werden oda nich ???