Duda con errorlevel en batch

Soy nuevo en programación y me di a la tarea de escribir un pequeño script en batch para hacer ping a dos IP diferentes, sin embargo, me he topado con la siguiente problemática:

El valor de errorlevel siempre es 0 después del primer ping y no logro encontrar como quitar ese valor después del primer ping para que cuando se realice el segundopin tome el valor correcto y no conserve el primero.

Mi código es el siguiente:

@echo off
set "gate=192.168.1.254"
set "server=192.168.1.67"

call ping -n 1 "%gate%" | findstr /r /c:"[0-9] *ms"
if %errorlevel% EQU 0 (
call ping -n 1 "%server%" | findstr /r /c:"[0-9] *ms"
if %errorlevel% EQU 0 (
echo esta el servidor
pause
exit
) else (
echo el server esta disponible
pause
exit
)
) else (
echo el gateway no esta disponible.
exit
)

Le pido humildmente en un espacio libre que posea, me comparta que puedo hacer para dar solución a este detalle.

Respuesta
1

Si te entiendo bien lo que quieres es que si el ping al gateway da error saque el mensaje "el gateway no esta disponible" y se acabe. Si el ping al gateway va bien entonces se debe hacer el ping al server, que puede ir bien, en cuyo caso se sacaría el mensaje "esta el servidor" o ir mal, en cuyo caso debería sacar el mensaje "el server no esta disponible" (aunque en tu bat diga "el server esta disponible"). El errorlevel es un poco rarito en cuanto a su comportamiento. Te sugiero que pruebes con:

@echo off
set "gate=192.168.1.254"
set "server=192.168.1.67"
call ping -n 1 "%gate%" | findstr /r /c:"[0-9] *ms"
if errorlevel 1 goto :nogate
call ping -n 1 "%server%" | findstr /r /c:"[0-9] *ms"
if errorlevel 1 goto :noserver
echo esta el servidor
goto :fin
:Noserver
Echo el server no esta disponible
goto :fin
:Nogate
Echo el gateway no esta disponible.
:Fin
Pause
exit

Ya me dirás.

Las mayúsculas en las etiquetas y en algunos "echo" las pone el editor de la página, pero, en este caso, no afectan al funcionamiento.

Y si entiendes inglés échale un vistazo a este enlace:

https://blogs.msdn.microsoft.com/oldnewthing/20080926-00/?p=20743

Muchas gracias, me ha sido de gran ayuda su aporte.

He seguido dándole vueltas al asunto porque, tal como se indica en el enlace que te pasé, si no se utiliza internamente una variable local de nombre ERRORLEVEL el sistema deja en ella el valor del errorlevel. Y entonces no entendía por qué no te funcionaba. Y creo que ya sé por qué. Tiene que ver con que se está intentando ver en un nivel interno el valor de una variable que tiene un valor más externo. Por tanto hay que usar el comando "Setlocal EnableDelayedExpansion" y en el if interno referirse a la variable como ! Errorlevel! En vez de %errorlevel%. Comprueba que así sí que funciona:

@echo off
Setlocal EnableDelayedExpansion
set "gate=192.168.1.254"
set "server=192.168.1.67"
call ping -n 1 "%gate%" | findstr /r /c:"[0-9] *ms"
if %errorlevel% EQU 0 (
call ping -n 1 "%server%" | findstr /r /c:"[0-9] *ms"
if !errorlevel! EQU 0 (
echo esta el servidor
pause
exit
) else (
echo el server no esta disponible
pause
exit
)
) else (
echo el gateway no esta disponible.
exit
)

Espero que el editor de la página no haga de las suyas pero puede que ponga el "echo" como "Echo" lo cual no afecta al funcionamiento. A veces introduce un espacio entre "!" y lo que venga después, y eso ya si que invalidaría el comando.

¡Gracias! Sr. GGGIRALD. 

Le comparto mi experiencia:

Lo que encontré es que cuando daba ping al servidor, a pesar que la IP no respondía por estar inaccesible, hacia eco hacia la loopback y errorleve tomaba el valor de 0. Entonces debí guiarme por el tema de ttls del ping y hacer esa diferencia a lo que agregué ping -n 1 "%server%" | find "TTL">nul y con ligera modificación realizaba bien la condición. Lo he probado varias veces en diferentes escenarios y el batch realiza lo que estaba buscando.
Agradezco infinitamente su apoyo.

Yo no quise cambiarte el planteamiento pero lo que tengo guardado en mis ejemplos similares era algo como:

:: Manejo del ping en SO que no tratan correctamente el errorlevel con el ping
@echo off
ping 194.194.8.235 -n 10 | find "TTL" > nul
if errorlevel 1 echo ping incorrecto

que coincide con lo que me has indicado.

Y no tienes que agradecerme nada. Realmente me divierto bastante con estos temas.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas