command-line - google - create ping batch file
Cómo verificar si el ping respondió o no en un archivo por lotes (10)
Quiero hacer ping continuamente a un servidor y ver un cuadro de mensaje cuando responda, es decir, el servidor está actualmente inactivo. Quiero hacerlo a través de un archivo por lotes.
Puedo mostrar un cuadro de mensaje como se muestra aquí Mostrar un cuadro emergente / mensaje de un archivo por lotes de Windows
y puede hacer ping continuamente por
ping <servername> -t
¿Pero cómo verifico si respondió o no?
Aquí hay algo que encontré:
:pingtheserver
ping %input% | find "Reply" > nul
if not errorlevel 1 (
echo server is online, up and running.
) else (
echo host has been taken down wait 3 seconds to refresh
ping 1.1.1.1 -n 1 -w 3000 >NUL
goto :pingtheserver
)
Tenga en cuenta que ping 1.1.1.1 -n -w 1000 >NUL
esperará 1 segundo, pero solo funciona cuando está conectado a una red
El siguiente programa checklink.cmd
es un buen lugar para comenzar. Se basa en el hecho de que puede hacer un ping de un solo disparo y que, si tiene éxito, la salida contendrá la línea:
Packets: Sent = 1, Received = 1, Lost = 0 (0% loss),
Al extraer los tokens 5 y 7 y comprobar que son, respectivamente, "Received"
y "1,"
, puede detectar el éxito.
@setlocal enableextensions enabledelayedexpansion
@echo off
set ipaddr=%1
:loop
set state=down
for /f "tokens=5,6,7" %%a in (''ping -n 1 !ipaddr!'') do (
if "x%%b"=="xunreachable." goto :endloop
if "x%%a"=="xReceived" if "x%%c"=="x1," set state=up
)
:endloop
echo.Link is !state!
ping -n 6 127.0.0.1 >nul: 2>nul:
goto :loop
endlocal
Llámalo con el nombre (o dirección IP) que quieras probar:
checklink 127.0.0.1
checklink localhost
checklink nosuchaddress
Tenga en cuenta que, si su configuración regional no es inglés, debe reemplazar Received
por la palabra clave correspondiente en su configuración regional, por ejemplo, para el español. Haga un ping de prueba para descubrir qué palabra clave se usa en su configuración regional.
Para notificarte solo cuando el estado cambie , puedes usar:
@setlocal enableextensions enabledelayedexpansion
@echo off
set ipaddr=%1
set oldstate=neither
:loop
set state=down
for /f "tokens=5,7" %%a in (''ping -n 1 !ipaddr!'') do (
if "x%%a"=="xReceived" if "x%%b"=="x1," set state=up
)
if not !state!==!oldstate! (
echo.Link is !state!
set oldstate=!state!
)
ping -n 2 127.0.0.1 >nul: 2>nul:
goto :loop
endlocal
Sin embargo, como señala Gabe en un comentario, puedes usar ERRORLEVEL
para que el equivalente de ese segundo script se convierta en:
@setlocal enableextensions enabledelayedexpansion
@echo off
set ipaddr=%1
set oldstate=neither
:loop
set state=up
ping -n 1 !ipaddr! >nul: 2>nul:
if not !errorlevel!==0 set state=down
if not !state!==!oldstate! (
echo.Link is !state!
set oldstate=!state!
)
ping -n 2 127.0.0.1 >nul: 2>nul:
goto :loop
endlocal
Espero que esto ayude a alguien. Utilizo este poco de lógica para verificar si los recursos compartidos de red son receptivos antes de verificar las rutas individuales. Debe manejar nombres DNS y direcciones IP
Una ruta válida en el archivo de texto sería / 192.168.1.2 / ''carpeta'' o / NAS / ''carpeta''
@echo off
title Network Folder Check
pushd "%~dp0"
:00
cls
for /f "delims=//" %%A in (Files-to-Check.txt) do set Server=%%A
setlocal EnableDelayedExpansion
ping -n 1 %Server% | findstr TTL= >nul
if %errorlevel%==1 (
ping -n 1 %Server% | findstr "Reply from" | findstr "time" >nul
if !errorlevel!==1 (echo Network Asset %Server% Not Found & pause & goto EOF)
)
:EOF
He creado una solución alternativa basada en la publicación de paxdiablo
Coloque el siguiente código en Waitlink.cmd
@setlocal enableextensions enabledelayedexpansion
@echo off
set ipaddr=%1
:loop
set state=up
ping -n 1 !ipaddr! >nul: 2>nul:
if not !errorlevel!==0 set state=down
echo.Link is !state!
if "!state!"=="up" (
goto :endloop
)
ping -n 6 127.0.0.1 >nul: 2>nul:
goto :loop
:endloop
endlocal
Por ejemplo, utilícelo de otro archivo por lotes como este
call Waitlink someurl.com
net use o: //someurl.com/myshare
La llamada a waitlink solo regresará cuando un ping haya sido exitoso. Gracias a paxdiablo y Gabe. Espero que esto ayude a alguien más.
He visto tres resultados a un ping: el que "queremos" donde el IP responde, "Host inalcanzable" y "tiempo de espera agotado" (no estoy seguro de la redacción exacta).
Los primeros dos devuelven ERRORLEVEL de 0.
Timeout devuelve ERRORLEVEL de 1.
¿Los otros resultados y niveles de error pueden ser devueltos? (Además de usar un conmutador no válido que devuelve los conmutadores permitidos y un nivel de error de 1.)
Aparentemente, Host Inaccesible puede usar uno de los métodos publicados anteriormente (aunque es difícil saber cuándo alguien responde en qué caso están escribiendo el código), pero ¿se devuelve el tiempo de espera de manera similar que se puede analizar?
En general, ¿cómo se sabe qué parte de los resultados del ping se puede analizar? (Es decir, ¿por qué los mensajes Enviados y / o Recibidos y / o TTL pueden ser analizables, pero no son inalcanzables?
Ah, e iSid, tal vez no haya muchos upvotes porque las personas que leen esto no tienen suficientes puntos. Entonces ellos responden (o no) su pregunta y se van.
No estaba publicando lo anterior como una respuesta. Debería haber sido un comentario, pero no vi esa opción.
La pregunta era si el ping respondía lo que hace este script.
Sin embargo, esto no funcionará si obtiene el mensaje de Host Inaccesible, ya que esto devuelve ERRORLEVEL 0 y pasa el cheque de Received = 1 utilizado en este script, devolviendo Link es UP del script. Host inalcanzable se produce cuando el ping se entregó al trabajo original pero no se puede encontrar el host remoto.
Si recuerdo que la forma correcta de verificar si el ping fue exitoso es buscar la cadena ''TTL'' usando Buscar.
@echo off
cls
set ip=%1
ping -n 1 %ip% | find "TTL"
if not errorlevel 1 set error=win
if errorlevel 1 set error=fail
cls
echo Result: %error%
Esto no funcionará con redes IPv6 porque ping no mostrará TTL al recibir respuesta de la dirección IPv6.
Puede hacer ping sin "-t" y verificar el código de salida del ping. Informa fracaso cuando no hay respuesta.
Sé que este es un hilo antiguo, pero quería probar si una máquina estaba activa en mi sistema y, a menos que no haya entendido bien, nada de lo anterior funciona si mi enrutador informa que no se puede acceder a una dirección. Estoy usando un archivo por lotes en lugar de un script porque quería "KISS" en casi cualquier máquina WIN. Entonces el enfoque que utilicé fue hacer más de un ping y probar "Lost = 0" de la siguiente manera
ping -n 2 %pingAddr% | find /I "Lost = 0"
if %errorlevel% == 0 goto OK
No lo he probado rigurosamente, pero hasta ahora hace el trabajo por mí
Versión simple:
for /F "delims==, tokens=4" %a IN (''ping -n 2 127.0.0.1 ^| findstr /R "^Packets: Sent =.$"'') DO (
if %a EQU 2 (
echo Success
) ELSE (
echo FAIL
)
)
Pero a veces el primer ping solo falla y el segundo funciona (o viceversa) ¿verdad? Así que queremos tener éxito cuando al menos una respuesta ICMP ha sido devuelta con éxito:
for /F "delims==, tokens=4" %a IN (''ping -n 2 192.168.1.1 ^| findstr /R "^Packets: Sent =.$"'') DO (
if %a EQU 2 (
echo Success
) ELSE (
if %a EQU 1 (
echo Success
) ELSE (
echo FAIL
)
)
)
#!/bin/bash
logPath="pinglog.txt"
while(true)
do
# refresh the timestamp before each ping attempt
theTime=$(date -Iseconds)
# refresh the ping variable
ping google.com -n 1
if [ $? -eq 0 ]
then
echo $theTime + ''| connection is up'' >> $logPath
else
echo $theTime + ''| connection is down'' >> $logPath
fi
Sleep 1
echo '' ''
done