I want to continuously ping a server and see a message box when ever it responds i.e. server is currently down. I want to do it through batch file.
I can show a message box as said here Show a popup/message box from a Windows batch file
and can ping continuously by
ping <servername> -t
But how do I check if it responded or not?
you just have to use | find "TTL=" >nul after the ping command because this way if the ping was successful he devolve a TTL and the | find "TTL=" >nul will grep it for validation.
The following checklink.cmd
program is a good place to start. It relies on the fact that you can do a single-shot ping and that, if successful, the output will contain the line:
Packets: Sent = 1, Received = 1, Lost = 0 (0% loss),
By extracting tokens 5 and 7 and checking they're respectively "Received"
and "1,"
, you can detect the success.
@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
Call it with the name (or IP address) you want to test:
checklink 127.0.0.1 checklink localhost checklink nosuchaddress
Take into account that, if your locale is not English, you must replace Received
with the corresponding keyword in your locale, for example recibidos
for Spanish. Do a test ping to discover what keyword is used in your locale.
To only notify you when the state changes, you can use:
@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
However, as Gabe points out in a comment, you can just use ERRORLEVEL
so the equivalent of that second script above becomes:
@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
The question was to see if ping responded which this script does.
However this will not work if you get the Host Unreachable message as this returns ERRORLEVEL 0 and passes the check for Received = 1 used in this script, returning Link is UP from the script. Host Unreachable occurs when ping was delivered to target notwork but remote host cannot be found.
If I recall the correct way to check if ping was successful is to look for the string 'TTL' using Find.
@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%
This wont work with IPv6 networks because ping will not list TTL when receiving reply from IPv6 address.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With