giadsc
Goto Top

FOR x mal ausführen oder bis String in Datei gefunden wurde

Hallo zusammen,

Ich habe wieder einmal ein Fall den ich nicht hin kriege.
Muss ein Backup für eine Applikation schreiben und als letzter Test schaue ich in einem Log File ob er Eintrag "Server ready" vorhanden ist.
Ich möchte dies in einer FOR-Schleife machen und dabei x mal die Schleife durchlaufen und mittels findstr den Ausdruck "Server ready" suchen.
Wenn der Ausdruck vorhanden ist möchte ich jedoch direkt aus der FOR-Schleife heraus springen.

Habe mir so etwas vorgestellt. jedoch bekomme ich jedem Fall "Backup successful"

echo on

echo %errorlevel%
FOR /L %%A IN (1,1,2) do (
	findstr /I /S /C:"Server ready" *.log  
	echo %errorlevel%
	if %errorlevel% == 0 goto success
	timeout /T 2 /NOBREAK
	)
echo %errorlevel%
	
:failed
set status=Backup failed
goto sendmail

:success
set status=Backup successful
goto sendmail

:sendmail
echo Der Status ist: %status%
pause

Vielen Dank, Ihr kreativen Köpfe
der FORzweifelte.. face-smile

Content-Key: 294488

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

Printed on: April 18, 2024 at 06:04 o'clock

Member: Biber
Solution Biber Jan 28, 2016, updated at Jan 29, 2016 at 08:04:50 (UTC)
Goto Top
Moin giadsc,

für den CMD-Interpreter ist die auf Zeile 04 bis Zeile 09 auseinandergezoge FOR-Anweisung nur EINE Befehlszeile.
Das heisst, alle Variablen in dieser Befehlzeile habe genau einen Wert, nämlich den Variablenwert bei Beginn der Ausführung dieser Befehlszeile.

Bei "Betreten" der FOR-Anweisung ist aber der %errorlevel% gleich 0, und daran ändert sich auch in der Rumkreiserei in den Zeilen 05-08 nix.

Abhilfe:
a) Über Setlocal EnableDelayedExpansion ( siehe Forumssuche)
und Abfrage if !errorlevel!== 0 goto :allesprima statt if %errorlevel%== 0 goto :allesprima
b) über Abfrage if not errorlevel 1 goto :allesprima statt if %errorlevel%== 0 goto :allesprima
c) über findstr /I /S /C:"Server ready" *.log >nul && goto :allesprima statt der Prüfung der Variablen %errorlevel%

oder d) Verzicht auf die FOR-Anweisung.
Denn was soll es... wieso sollte FINDSTR beim ersten Lesen der *.log-Files weniger "server ready"-Zeilen Finden als beim siebten Durchlauf?
Entweder es steht nach dem Backup im Logfile oder eben nicht.
Also prüfe doch den %errorlevel% ohne FOR-Anweisung.

Grüße
Biber
Member: giadsc
giadsc Jan 28, 2016 updated at 17:47:30 (UTC)
Goto Top
Hallo Biber,

Vielen Dank für Deine ausführlichen Erläuterungen. Das hab ich mir schon gedacht, dass das mit %errorlevel% in einer FOR-Schlaufe nichts wird...
Ich lese das Log mit findstr aus während Dienste gestartet werden. Die Idee war, dass wenn nach einer gewissen Zeit kein "Server ready" im log steht, das System nicht sauber hochgefahren ist und somit auch das Backup nicht sauber ist.
Die Schleife wollte ich nicht endlos, da ich sonst keine Rückmeldung erhalte wenn der Dienst nicht gestartet wird...

Habe mir nun anders beholfen:

set count=1
:timeout_server
timeout /T 10 /NOBREAK
findstr /I /S /C:"startup  - Server ready" *.log  
if %count% == 6 goto end_timeout_server
if %errorlevel% == 1 set /A count=count+1
if %errorlevel% == 1 goto timeout_server
if %errorlevel% == 0 echo [%date% %time%] Server Ready >> %logfile%
:end_timeout_server

if %errorlevel% == 1 echo [%date% %time%] BACKUP FAILED! >> %logfile%
if %errorlevel% == 0 echo [%date% %time%] Backup successful>> %logfile%

sicher nicht perfekt, aber es funktioniert face-smile

Vielen Dank für Deine Bemühungen

Grüsse
giadsc