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
positive Bewertung({{pro_count}})
Beitrag bewerten:
{{percentage}} % positiv
negative Bewertung({{con_count}})

DANKE für deine Bewertung!

Fragen / Kommentare


(sortiert nach Bewertung / Datum) [alle Kommentare(neueste zuerst)]

✍anonym
02.10.2018 11:27
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 :)

✍anonym
18.10.2018 09:27
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

✍anonym
08.09.2018 12:46
User: Lexor 
Warum für das Warten nicht @timeout nutzen?
✍Bernhard
gepostet am 08.09.2018 12:46
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

✍anonym
26.05.2018 10:35
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

✍anonym
06.01.2017 10:17
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?

✍anonym
10.08.2015 13:45
User: addto 
wie komme ich aus "Telnet exel" raus?

✍anonym
27.01.2013 17:51
User: Daniel 
if exist %datei.txt goto existiert

Was sagt das Prozentzeichen aus ?

✍anonym
13.06.2012 12:57
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.

✍anonym
08.11.2011 17:30
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 ???

✍anonym
05.07.2011 07:32
User: Nelson 
Danke genau das hatte ich gesucht

✍anonym
15.06.2011 17:34
User: Crash Override 
guter hilfetext

✍anonym
06.06.2011 10:41
User: Marci 
Gibts es auch das auf eine bestimmt taste gewarte wird?

Durch die weitere Nutzung der Seite stimmst du der Verwendung von Cookies zu Mehr Details