Abfrage ERRORLEVEL springt aus der FOR Schleife
Liebe Gemeinde,
ich habe eine kleine batch geschrieben, die aus einer liste (IPs) heraus Laufwerke mappen soll, darauf dann einige Dateien zippen und verschieben.
Solange alle Clients aus der Liste online sind, klappt alles wunderbar. Alle Laufwerke werden nacheinander gemappt und abgearbeitet. Sobald einer offline ist (Das Laufwerk kann ich also nicht mappen, sprich ERRORLEVEL=2) will ich die zwischenschritte überspringen und mit der nächsten IP weitermachen. ABER die FOR-Schleife wird verlassen und die batch beendet....
Die IP Liste sieht so aus:
192.168.AA.BB
192.168.BB.CC
192.168.CC.DD
192.168.DD.EE
Und die batch so:
setlocal EnableDelayedExpansion
net use B: /D /yes
FOR /f %%f IN (liste.txt) DO (
net use B: \\%%f\C$ PASSWORT /USER:"Benutzer"
echo ERRORLEVEL=%errorlevel%
if %errorlevel% EQU 2 goto weiter
md %%f
copy psexec.exe B:\WINDOWS\SYSTEM32
copy 7za.exe B:\WINDOWS\TEMP
pause
rem set stunden=%TIME:~0,2%
rem if "%stunden:~0,1%"==" " set stunden=0%stunden:~1,1%
psexec \\%%f -U Benutzer -p Passwort C:\WINDOWS\TEMP\7za a C:\WINDOWS\WORK\%DATE:~6,4%-%DATE:~3,2%-%DATE:~0,2%_%time:~0,2%-%time:~3,2%.zip C:\WINDOWS\WORK\*.*
pause
move B:\WINDOWS\WORK\*.zip %%f\
pause
net use B: /D /yes
:weiter
echo ich bin hier
pause
)
exit
Wenn ich also ein Laufwerk nicht mappen kann (Errorlevel=2), springt die batch sauber nach :WEITER aber dann aus der Schleife raus, und wird beendet....
Habe swchon alles versucht... Kann mir jemand helfen?
Danke sehr!
ich habe eine kleine batch geschrieben, die aus einer liste (IPs) heraus Laufwerke mappen soll, darauf dann einige Dateien zippen und verschieben.
Solange alle Clients aus der Liste online sind, klappt alles wunderbar. Alle Laufwerke werden nacheinander gemappt und abgearbeitet. Sobald einer offline ist (Das Laufwerk kann ich also nicht mappen, sprich ERRORLEVEL=2) will ich die zwischenschritte überspringen und mit der nächsten IP weitermachen. ABER die FOR-Schleife wird verlassen und die batch beendet....
Die IP Liste sieht so aus:
192.168.AA.BB
192.168.BB.CC
192.168.CC.DD
192.168.DD.EE
Und die batch so:
setlocal EnableDelayedExpansion
net use B: /D /yes
FOR /f %%f IN (liste.txt) DO (
net use B: \\%%f\C$ PASSWORT /USER:"Benutzer"
echo ERRORLEVEL=%errorlevel%
if %errorlevel% EQU 2 goto weiter
md %%f
copy psexec.exe B:\WINDOWS\SYSTEM32
copy 7za.exe B:\WINDOWS\TEMP
pause
rem set stunden=%TIME:~0,2%
rem if "%stunden:~0,1%"==" " set stunden=0%stunden:~1,1%
psexec \\%%f -U Benutzer -p Passwort C:\WINDOWS\TEMP\7za a C:\WINDOWS\WORK\%DATE:~6,4%-%DATE:~3,2%-%DATE:~0,2%_%time:~0,2%-%time:~3,2%.zip C:\WINDOWS\WORK\*.*
pause
move B:\WINDOWS\WORK\*.zip %%f\
pause
net use B: /D /yes
:weiter
echo ich bin hier
pause
)
exit
Wenn ich also ein Laufwerk nicht mappen kann (Errorlevel=2), springt die batch sauber nach :WEITER aber dann aus der Schleife raus, und wird beendet....
Habe swchon alles versucht... Kann mir jemand helfen?
Danke sehr!
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 338340
Url: https://administrator.de/contentid/338340
Ausgedruckt am: 15.11.2024 um 11:11 Uhr
8 Kommentare
Neuester Kommentar
Hallo Galindiesel,
versuch mal Deine Fallunterscheidung umzukehren und ohne goto innerhalb der Schleife zu arbeiten.
Alternativ:
Beides ist nicht getestet und was Du eigentlich alles machen willst habe ich mir nicht weiter angesehen.
Ich wollte nur Alternativen aufzeigen zum goto innerhalb der For-Schleife.
Gruß Frank
versuch mal Deine Fallunterscheidung umzukehren und ohne goto innerhalb der Schleife zu arbeiten.
setlocal EnableDelayedExpansion
net use B: /D /yes
FOR /f %%f IN (liste.txt) DO (
net use B: \\%%f\C$ PASSWORT /USER:"Benutzer"
echo ERRORLEVEL=%errorlevel%
if %errorlevel% EQU 0 (
md %%f
copy psexec.exe B:\WINDOWS\SYSTEM32
copy 7za.exe B:\WINDOWS\TEMP
pause
rem set stunden=%TIME:~0,2%
rem if "%stunden:~0,1%"==" " set stunden=0%stunden:~1,1%
psexec \\%%f -U Benutzer -p Passwort C:\WINDOWS\TEMP\7za a C:\WINDOWS\WORK\%DATE:~6,4%-%DATE:~3,2%-%DATE:~0,2%_%time:~0,2%-%time:~3,2%.zip C:\WINDOWS\WORK\*.*
pause
move B:\WINDOWS\WORK\*.zip %%f\
pause
net use B: /D /yes
)
)
exit
Alternativ:
setlocal EnableDelayedExpansion
net use B: /D /yes
FOR /f %%f IN (liste.txt) DO (
net use B: \\%%f\C$ PASSWORT /USER:"Benutzer"
echo ERRORLEVEL=%errorlevel%
if %errorlevel% EQU 0 call :machwas "%%f"
)
goto :eof
:machwas
md %1
copy psexec.exe B:\WINDOWS\SYSTEM32
copy 7za.exe B:\WINDOWS\TEMP
pause
rem set stunden=%TIME:~0,2%
rem if "%stunden:~0,1%"==" " set stunden=0%stunden:~1,1%
psexec \\%%f -U Benutzer -p Passwort C:\WINDOWS\TEMP\7za a C:\WINDOWS\WORK\%DATE:~6,4%-%DATE:~3,2%-%DATE:~0,2%_%time:~0,2%-%time:~3,2%.zip C:\WINDOWS\WORK\*.*
pause
move B:\WINDOWS\WORK\*.zip %1
pause
net use B: /D /yes
goto :eof
Beides ist nicht getestet und was Du eigentlich alles machen willst habe ich mir nicht weiter angesehen.
Ich wollte nur Alternativen aufzeigen zum goto innerhalb der For-Schleife.
Gruß Frank
Hallo Galindiesel,
Ja, kann es, probiers mal aus.
Sichworte:
setlocal DisableDelayedExpansion
setlocal EnableDelayedExpansion
Die Boardsuche bringt da sicher einiges.
Beispiel:
Warum funktioniert das echo in meiner for-Schleife auch mit Sonderzeichen?
(Hab gerade kein besseres auf die schnelle zur Hand)
Gruß Frank
Ja, kann es, probiers mal aus.
Sichworte:
setlocal DisableDelayedExpansion
setlocal EnableDelayedExpansion
Die Boardsuche bringt da sicher einiges.
Beispiel:
Warum funktioniert das echo in meiner for-Schleife auch mit Sonderzeichen?
(Hab gerade kein besseres auf die schnelle zur Hand)
Gruß Frank
Ja, Variablen werden innerhalb einer Kommandozeile oder eines (in Klammern eingefassten) Blocks von Kommandozeilen nur einmal zum Wert expandiert. Das passiert noch bevor die Zeile/der Block ausgeführt wird. Um diese "frühe" Erweiterung zu verhindern, gibt es die verzögerte Variablenerweiterung.
Du hättest natürlich auch noch weitere Alternativen:
1) Statt mit der %errorlevel% Variablen zu arbeiten, kannst du auch die alte "DOS" Errorlevelsyntax bei IF Statements verwenden.
... führt "Kommando" aus wenn der Errorlevelwert größer oder gleich 2 ist. Mit dem NOT Operator kombiniert ...
... wird "Kommando" ausgeführt, wenn der Errorlevelwert nicht größer oder gleich 2 (also kleiner als 2) ist.
2) Wenn es nur darum geht, zu prüfen, ob ein Befehl einen Errorlevelwert von entweder 0 oder ungleich 0 zurückgegeben hat, kannst du auch die logische Befehlsverkettung nutzen.
"Kommando1" wird ausgeführt, wenn "Befehl" erfolgreich war (Errorlevel 0). "Kommando2" wird ausgeführt, wenn "Befehl" fehlgeschlagen ist (Errorlevel ungleich 0).
Grüße
rubberman
Du hättest natürlich auch noch weitere Alternativen:
1) Statt mit der %errorlevel% Variablen zu arbeiten, kannst du auch die alte "DOS" Errorlevelsyntax bei IF Statements verwenden.
if errorlevel 2 Kommando
... führt "Kommando" aus wenn der Errorlevelwert größer oder gleich 2 ist. Mit dem NOT Operator kombiniert ...
if not errorlevel 2 Kommando
... wird "Kommando" ausgeführt, wenn der Errorlevelwert nicht größer oder gleich 2 (also kleiner als 2) ist.
2) Wenn es nur darum geht, zu prüfen, ob ein Befehl einen Errorlevelwert von entweder 0 oder ungleich 0 zurückgegeben hat, kannst du auch die logische Befehlsverkettung nutzen.
Grüße
rubberman
Hallo Eugen,
Ich nicht...
Folgender Code-Rahmen funktioniert bei mir:
Test.cmd
Liste.txt
Anmerkung:
Das
Bei Prozentzeichen tut es bei mir auch nicht korrekt, da dann nicht der momentane Wert verwendet wird.
Gruß Frank
Ich nicht...
Folgender Code-Rahmen funktioniert bei mir:
Test.cmd
@echo off
if exist B:\. net use B: /D /yes >nul 2>&1
if exist B:\. (
echo Laufwerk B: konnte nicht getrennt werden.
goto ende
)
setlocal EnableDelayedExpansion
FOR /f %%f IN (Liste.txt) DO (
net use B: \\%%f\C$ KENNWORT /USER:"BENUTZER" >nul 2>&1
echo ***
echo Durchlauf mit %%f
echo ERRORLEVEL: !errorlevel!
if !errorlevel! EQU 0 (
echo Server %%f ist verbunden.
if not exist %%f\. md %%f
echo Aktionen wurden ausgefuehrt
net use B: /D /yes >nul
) else (
echo Server %%f ist nicht verbunden.
echo Keine Aktionen ausgefuehrt
)
)
:ende
Liste.txt
EinServer
KeinServer
AndererServer
Anmerkung:
Das
>nul 2>&1
hinter net use...
ist nur Kosmetik, um Meldungen und Fehlermeldungen ins Nichts zu schicken, da mich deren Inhalt hier nicht interessiert und sonst nur zwischen meine echo-Ausgaben funken würde.Zitat von @Galindiesel:
...dort ändert er sich nicht (egal was ich tue), trotz: setlocal EnableDelayedExpansion....
Hast Du die Abfrage mit Prozent- oder mit Ausrufezeichen ausgeführt?...dort ändert er sich nicht (egal was ich tue), trotz: setlocal EnableDelayedExpansion....
if %errorlevel% EQU 0
oder if !errorlevel! EQU 0
Bei Prozentzeichen tut es bei mir auch nicht korrekt, da dann nicht der momentane Wert verwendet wird.
Gruß Frank
Hallo Eugen,
freu mich, dass ich helfen konnte.
Ein Ansatz wäre innerhalb der Batch, individuell Zeilenausgaben umzuleiten oder pauschal die Ausgabe der Batchdatei beim Aufruf ebendieser umzuleiten.
Schau Dir das mal an (insbesondere den Abschnitt 2.):
Batch - ein paar Basics die man kennen sollte
Solltest Du dann noch Fragen haben, dann nur zu.
Gruß Frank
freu mich, dass ich helfen konnte.
Zitat von @Galindiesel:
Was genau macht >nul 2>&1
Wie kann ich die komplette Ausgabe, so wie ich sie in der CMD box sehe, als Logdatei abspeichern? Weißt du das zufällig?
Was genau macht >nul 2>&1
Wie kann ich die komplette Ausgabe, so wie ich sie in der CMD box sehe, als Logdatei abspeichern? Weißt du das zufällig?
Ein Ansatz wäre innerhalb der Batch, individuell Zeilenausgaben umzuleiten oder pauschal die Ausgabe der Batchdatei beim Aufruf ebendieser umzuleiten.
Schau Dir das mal an (insbesondere den Abschnitt 2.):
Batch - ein paar Basics die man kennen sollte
Solltest Du dann noch Fragen haben, dann nur zu.
Gruß Frank