meine fehlerhafte Batch

>|Sh4d0w|<

Commander
Registriert
Jan. 2009
Beiträge
2.489
Hallo zusammen,
irgendwie bekomme ich das mit den Errorlevel nicht hin. Habe da jetzt schon einzelne Steps in der Batch ausprobiert und entgegen meiner Erwartung lösen beide aus. Mein Fileserver soll heruntergefehran werden, wenn ich von meinemPC eine Batch auslöse (schreibt Datei shutdown.shut ins Verzeichnis) und ALLE weiteren Bedingungen auf dem Fileserver erfüllt sind. Wenn eine Nicht erfüllt ist, soll er wieder zum Start gehen und es nach 5 Minuten erneut versuchen.


PS: Falls ihr euch wegen dem Desktopnamen NoMaam wundert, ich bin AlBundy Fan ;D


Code:
:: Schutz vor ausversehenen Start
:: ===============================
ping localhost -n 10

:://REM WICHTIG!!! DESKTOP-PC MUSS ANPINGBAR SEIN!!!
:://REM WICHTIG!!! DESKTOP-PC MUSS ANPINGBAR SEIN!!!
:://REM WICHTIG!!! DESKTOP-PC MUSS ANPINGBAR SEIN!!!
:://REM WICHTIG!!! DESKTOP-PC MUSS ANPINGBAR SEIN!!!


set jahr=%date:~-4%
set monat=%date:~-7,2%
set tag=%date:~-10,2%
set stunde=%time:~1,1%
set minute=%time:~-8,2%

set NameDesktopPC=NoMaam

set PfadDatei=V:\FlexRAID\#INSTALL\#shutdown\Datei\shutdown.shut
set LogShutdown=D:\BACKUP\#shutdown.log

set taskname=Server_nach_Nichtnutzung_herunterfahren
call C:\#Install\Scripte\#call_task_log


:start
TIMEOUT /T 300


:://REM Bedingung1=Datei vorhanden?
:B1_Datei
if NOT EXIST "%PfadDatei%" goto start
if EXIST "%PfadDatei%" (
TIMEOUT /T 1800
goto B2_PingDesktop
)

:B2_PingDesktop
ping %NameDesktopPC% | findstr /i Zeitüberschreitung
IF ERRORLEVEL == 0 (
  ECHO NOT Running.
  goto B3_RARexe)
IF ERRORLEVEL == 1 (
	goto start)

:://REM Bedingung1=Läuft der Prozess Rar.exe?
:B3_RARexe
tasklist | findstr /i Rar.exe
IF ERRORLEVEL == 0 (
  ECHO NOT Running.
  goto B5_ROBOCOPYexe)
IF ERRORLEVEL == 1 (
	goto start)

:://REM Bedingung3=Läuft der Prozess robocopy.exe?
:B5_ROBOCOPYexe
tasklist | findstr /i robocopy.exe
IF ERRORLEVEL == 0 (
  ECHO NOT Running.
  goto shutdown)
IF ERRORLEVEL == 1 (
	goto start)
	
:shutdown
erase "%PfadDatei%" /Q
echo "%jahr%-%monat%-%tag%_%stunde%:%minute% -- Server wird heruntergefahren" >> %LogShutdown%
%windir%\system32\shutdown.exe -s -f -t 0
 
Zuletzt bearbeitet:
​Sollte alles korrekt sein, aber du hast Anführungszeichen zuviel oder zuwenig bei Zeile 32, 33, 66. Bei 65 brauchst du eigentlich auch keine.
 
Danke für den genauen Blick, das fällt hier in CB besser als im Notepad++ auf. Ich hantiere sehr gerne mit den Anführungszeichen, weil spätestens wenn im Pfad ein Leerzeichen drin ist benötige ich die.

Hmm wenn ich :B2_PingDesktop separat in einer Batch ausführe, dann erhalte ich bei Errorlevel 0 und bei 1 ein "Echo" (zum testen eingebaut)
 
Du kannst im n++ bei Sprache auf Batch schalten, da sollte es eigentlich auch auffallen ^^.

Edit: Ah ne, im n++ wird gar nix markiert. Komisch...
Ergänzung ()

Beim ping ist der Rückgabewert umgekehrt. Wenn also der Rechner nicht mehr erreichbar ist -> ERR == 1

Schreibs so

ping -n 1 -l 128 -w 2000 %NameDesktopPC%
IF ERRORLEVEL == 1 (
ECHO "HOST DOWN"
goto B3_RARexe
)
IF ERRORLEVEL == 0 (
ECHO "HOST RUNNING"
goto start
​)
Ergänzung ()

Du kannst dein Code auch noch kürzen. Bei alle ERR-Abfragen (außer Ping) statt:
Code:
tasklist | findstr /i robocopy.exe
IF ERRORLEVEL == 0 (
ECHO NOT Running.
goto shutdown
)
IF ERRORLEVEL == 1 (
    goto start
)
lieber ein paar Zeilen kürzer
Code:
tasklist | findstr /i robocopy.exe
IF NOT ERRORLEVEL == 0 goto start

und bei Ping statt
Code:
IF ERRORLEVEL == 1 (
ECHO "HOST DOWN"
goto B3_RARexe
)
IF ERRORLEVEL == 0 (
ECHO "HOST RUNNING"
goto start
​​)

einfach
Code:
IF NOT ERRORLEVEL == 1 GOTO START
Ergänzung ()

Also hier nochmal überarbeitet (Wofür ist deine 3. Zeile? Bei Shutdown wird bei t=0 der Schalter f ignoriert, deshalb angepasst):

Code:
:: Schutz vor ausversehenen Start:: ===============================
set jahr=%date:~-4%
set monat=%date:~-7,2%
set tag=%date:~-10,2%
set stunde=%time:~1,1%
set minute=%time:~-8,2%
 
set NameDesktopPC=NoMaam
set PfadDatei=V:\FlexRAID\#INSTALL\#shutdown\Datei\shutdown.shut
set LogShutdown=D:\BACKUP\#shutdown.log
set taskname=Server_nach_Nichtnutzung_herunterfahren

call C:\#Install\Scripte\#call_task_log
 
:start
TIMEOUT /T 300
  
:://REM Bedingung1=Datei vorhanden?
IF NOT EXIST %PfadDatei% goto start 

TIMEOUT /T 1800
 
:://REM Bedingung2=PC down?
ping -4 -n 1 -l 128 -w 2000 %NameDesktopPC%
:://-4 IPv4, -n Anzahl, -l Paketlänge, -w Zeitbuffer zum Warten auf Rückmeldung
IF NOT ERRORLEVEL == 1 goto start
 
:://REM Bedingung3=Läuft der Prozess Rar.exe?
tasklist | findstr /i Rar.exe
IF NOT ERRORLEVEL == 0 goto start
 
:://REM Bedingung4=Läuft der Prozess robocopy.exe?
tasklist | findstr /i robocopy.exe
IF NOT ERRORLEVEL == 0 goto start
    
erase "%PfadDatei%" /Q
echo "%jahr%-%monat%-%tag%_%stunde%:%minute% -- Server wird heruntergefahren" >> %LogShutdown%
%windir%\system32\shutdown.exe /s /t 10
 
Zuletzt bearbeitet:
Ich hatte zuerst die explizite Auflistung mit den Errorleveln 0 und 1 reingemacht, damit es für mich übersichtlicher ist. Aber danke deines Beispiels brauche ich das nicht mehr, da es dennoch recht einfach ist und Sinn ergibt :) Ganz schön kurz geworden, wobei ich kein Programmierer bin, der da eventuell mit dem Speicher besser umgehen muss ;-)

Vielen Lieben Dank.

Haben eigentlich alle Befehle Errorlevel?
 
merkwürdig bei MS, mal wieder eine bearbeitete Seite wo dann der Link nicht mehr geht :(
Ergänzung ()

Habe meine Batch nochmal leicht modifiziert, sodass es nun eine zweite Sprungmarke gibt, AB den Bedingungen nach der Dateiprüfung, da er sonst bei jede fehlgeschlagenen Bedingung eine halbe Stunde Pause einlegt. Die halbe Std. soll nur für den Fall sein, wenn quasi durch die Datei ein shutdown eingeleitet werden soll.

Der 300s-Timeout nach der Start Sprungmarke ist dafür gedacht, dass er es alle 5 Minuten erneut versucht. Das Script wird nach dem Hochfahren automatisch gestartet und nicht erneut gestartet, soll quasi immer wie eine Art "Dienst" laufen ;-)

Bei pin könnte man theor. auch -4 weglassen, da ich IPv6 eh ausgeschaltet habe.


Code:
:: Schutz vor ausversehenen Start
:: ===============================
ping localhost -n 10

:://REM WICHTIG!!! DESKTOP-PC MUSS ANPINGBAR SEIN (FIREWALL)!!!
:://REM WICHTIG!!! DESKTOP-PC MUSS ANPINGBAR SEIN (FIREWALL)!!!
:://REM WICHTIG!!! DESKTOP-PC MUSS ANPINGBAR SEIN (FIREWALL)!!!

set jahr=%date:~-4%
set monat=%date:~-7,2%
set tag=%date:~-10,2%
set stunde=%time:~1,1%
set minute=%time:~-8,2%

set NameDesktopPC=NoMaam

set PfadDatei=V:\FlexRAID\#INSTALL\#shutdown\Datei\shutdown.shut
set LogShutdown=D:\BACKUP\#shutdown.log

set taskname=Server_nach_Nichtbenutzung_herunterfahren
call C:\#Install\Scripte\#call_task_log


:start
TIMEOUT /T 300
  
:://REM Bedingung1=Datei vorhanden?
IF NOT EXIST %PfadDatei% goto start 
TIMEOUT /T 1800

:bedingungen
TIMEOUT /T 300

:://REM Bedingung2=Desktop-PC down?
ping -4 -n 1 -l 128 -w 2000 %NameDesktopPC%
:://-4 IPv4, -n Anzahl, -l Paketlänge, -w Zeitbuffer zum Warten auf Rückmeldung
IF NOT ERRORLEVEL == 1 goto bedingungen
 
:://REM Bedingung3=Läuft der Prozess Rar.exe?
tasklist | findstr /i Rar.exe
IF NOT ERRORLEVEL == 1 goto bedingungen
 
:://REM Bedingung4=Läuft der Prozess robocopy.exe?
tasklist | findstr /i robocopy.exe
IF NOT ERRORLEVEL == 1 goto bedingungen
    
erase "%PfadDatei%" /Q
echo "%jahr%-%monat%-%tag%_%stunde%:%minute% -- Server wird heruntergefahren" >> %LogShutdown%
%windir%\system32\shutdown.exe /s /t 10
Ergänzung ()

Habe es nun ausprobiert. Irgendwie ist er der Meinung, dass der die Bedingungen erfolgreich überspringt, obwohl die Bedingung falsch ist. Habe den Errorlevel aller anderen von 0 auf 1 geändert, nun scheint es zu klappen
 
Zuletzt bearbeitet:
Zurück
Oben