For bringt falsches Errorlevel
Guten Morgen,
mein Ziel ist es aus den for Schleifen das Errorlevel des Pings zu bekommen, komischerweise bekomme ich trotz DelayedExpansion
immer eine 0.
Kennt ihr das Problem oder habt vielleicht eine Lösung dafür?
mein Ziel ist es aus den for Schleifen das Errorlevel des Pings zu bekommen, komischerweise bekomme ich trotz DelayedExpansion
immer eine 0.
Kennt ihr das Problem oder habt vielleicht eine Lösung dafür?
@echo off & setlocal EnableDelayedExpansion
for /f "tokens=3,6,9delims= " %%a in ('ping -n 1 %1 -w 1000^|find "Maximum"') do set latenz=%%a%%b%%c
IF ERRORLEVEL 1 for /f "tokens=3,6,9delims= " %%a in ('ping %1 -w 1000^|find "Maximum"') do set latenz=%%a%%b%%c
IF %ERRORLEVEL%==0 GOTO ok
IF %ERRORLEVEL%==1 GOTO err
:err
echo CRITICAL: Remote Host %1 ist nicht erreichbar!
exit /B 1
:ok
echo OK: %1 ist in erreichbar! ^| %latenz%
exit /B 0
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 253236
Url: https://administrator.de/forum/for-bringt-falsches-errorlevel-253236.html
Ausgedruckt am: 22.04.2025 um 01:04 Uhr
5 Kommentare
Neuester Kommentar
Hallo golsin,
ich habe mit deiner Umsetzung so meine Probleme
Dein "Retry" verpufft völlig. Selbst wenn dort der Ping noch erfolgreich war, endest du im Label :err. Das ganze GOTO Konstrukt ist unnötig und die verzögerte Variablenerweiterung auch. Das Leerzeichen gehört zu den Standard-Delimitern einer FOR /F Schleife. Wenn du keine anderen Delimiter definiert hast, kannst du das gänzlich weglassen.
Da du den Code offenbar aus der Kommandozeile oder einer anderen Batchdatei aufrufen willst, solltest du statt dessen sicherstellen, dass latenz nicht bereits vordefiniert ist. IF Statements kennen übrigens auch das Schlüsselwort NOT für die Negation des Vergleichsergebnisses. Wahlweise könntest du redundanten Code auch noch in eine Subroutine packen (wobei das bei einer Zeile auch egal ist ...).
Genug gemeckert (bitte als positive Kritik verstehen
). Ich zeig mal wie ich mir das vorstellen würde:
Beispiel:
Grüße
rubberman
ich habe mit deiner Umsetzung so meine Probleme
Dein "Retry" verpufft völlig. Selbst wenn dort der Ping noch erfolgreich war, endest du im Label :err. Das ganze GOTO Konstrukt ist unnötig und die verzögerte Variablenerweiterung auch. Das Leerzeichen gehört zu den Standard-Delimitern einer FOR /F Schleife. Wenn du keine anderen Delimiter definiert hast, kannst du das gänzlich weglassen.
Da du den Code offenbar aus der Kommandozeile oder einer anderen Batchdatei aufrufen willst, solltest du statt dessen sicherstellen, dass latenz nicht bereits vordefiniert ist. IF Statements kennen übrigens auch das Schlüsselwort NOT für die Negation des Vergleichsergebnisses. Wahlweise könntest du redundanten Code auch noch in eine Subroutine packen (wobei das bei einer Zeile auch egal ist ...).
Genug gemeckert (bitte als positive Kritik verstehen
@echo off &setlocal
set "latenz="
call :check %1
if not defined latenz call :check %1
if defined latenz (
echo OK: %1 ist in erreichbar! ^| %latenz%
exit /b 0
) else (
echo CRITICAL: Remote Host %1 ist nicht erreichbar!
exit /b 1
)
:check
for /f "tokens=3,6,9" %%a in ('ping -n 1 -w 1000 %1 ^|find "Maximum"') do set "latenz=%%a%%b%%c"
goto :eof
trotzdem schade das das mit dem Errorlevel nicht geht
Joa, ich sag mal so: Innerhalb der ausgeführten Kommandozeile gibt es auch einen Errorlevel. Zur Not kann man den dort ausgeben lassen und verarbeiten. Dieses Workaround ist dann aber noch komplizierter.Beispiel:
@echo off
for /f "tokens=1-3,6,9" %%a in (
'cmd /v:on /c "ping -n 1 -w 1000 localhost &echo Error_Level !errorlevel!" ^|findstr "Maximum Error_Level"'
) do if "%%a"=="Error_Level" (set "Error_Level=%%b") else set "latenz=%%c%%d%%e"
echo Latenz: %latenz%
echo Errorlevel: %Error_Level%
pause
rubberman