script google create batch bat command-line batch-file ping

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