galindiesel
Goto Top

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!

Content-ID: 338340

Url: https://administrator.de/contentid/338340

Ausgedruckt am: 15.11.2024 um 11:11 Uhr

Pedant
Pedant 19.05.2017 aktualisiert um 14:39:27 Uhr
Goto Top
Hallo Galindiesel,

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
Galindiesel
Galindiesel 19.05.2017 um 15:35:59 Uhr
Goto Top
Hallo Frank,

danke für die Rückmeldung. Ich habe jetzt verstanden, dass ich innerhalb einer FOR schleife kein GOTO benutzen darf (unbegreiflich für michn als Leien...)...
Habe jetzt beide Varianten ausprobiert, leider funktionieren beide nicht. Ich denke ich weiss warum. Die Variable ERRORLEVEL ändert sich nicht innerhalb der Schleife.... Sie ist entweder immer 0 oder immer 2 (je nach dem, ob die erste IP adresse in der Liste mappbar ist). Ich erninnere mich irgendwie an !VARIABLE! (also Ausrufungszeichen) innerhalb einer FOR-Schleife. Kann das damit zusammen hängen?

Danke & Gruß,
Diesel
Pedant
Pedant 19.05.2017 um 16:05:36 Uhr
Goto Top
Hallo Galindiesel,

Zitat von @Galindiesel:
Kann das damit zusammen hängen?
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
rubberman
rubberman 19.05.2017 um 18:29:34 Uhr
Goto Top
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.
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.
"Kommando1" wird ausgeführt, wenn "Befehl" erfolgreich war (Errorlevel 0). "Kommando2" wird ausgeführt, wenn "Befehl" fehlgeschlagen ist (Errorlevel ungleich 0).

Grüße
rubberman
Galindiesel
Galindiesel 22.05.2017 um 13:50:18 Uhr
Goto Top
Hallo Jungs,

ich krieg's nicht hin.... Mein Problem ist, dass ich den ERRORLEVEL innerhalb der FOR Schleife abfragen muss. Und dort ändert er sich nicht (egal was ich tue), trotz: setlocal EnableDelayedExpansion....

Habe jetzt aufgegeben... Ich ignoriere einfach die Tatsache, dass ein Laufwerk offline ist. Dann werden alle Zwischenschritte auch auf die "nicht vorhandenen" Laufwerke angewendet, was mir aber nicht weh tut. Das ganze dauert nur etwas länger...

Trotzdem Danke fürm eure Mühen!

Gruß,
Eugen
Pedant
Lösung Pedant 22.05.2017 aktualisiert um 17:39:29 Uhr
Goto Top
Hallo Eugen,

Zitat von @Galindiesel:
Habe jetzt aufgegeben...
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?
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
Galindiesel
Galindiesel 23.05.2017 um 10:34:33 Uhr
Goto Top
Hallo Frank,

FANTASTISCH!

Es funktioniert alles. Habe die batch nach meinen Bedürfnissen erweitert, klappt alles wunderbar!!
Zitat von @Pedant:
Hast Du die Abfrage mit Prozent- oder mit Ausrufezeichen ausgeführt?
if %errorlevel% EQU 0 oder if !errorlevel! EQU 0

Mit Prozent.... Vielleicht war das der Fehler... Zwei fragen habe ich aber nch zum Verständniss.

1) Was genau macht >nul 2>&1
Habe ich schon öfter in skripten gesehn, verstehe es aber nicht
2) Wie kann ich die komplette Ausgabe, so wie ich sie in der CMD box sehe, als Logdatei abspeichern? Weißt du das zufällig?

Nochmal vielen Dank, hier rockt die Bude face-smile Das erspart mir mind. 3 Tage arbeit.

Gruß,
Eugen
Pedant
Pedant 23.05.2017 aktualisiert um 11:05:00 Uhr
Goto Top
Hallo Eugen,

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?

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