Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to check if ping responded or not in a batch file

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?

like image 512
IsmailS Avatar asked Jun 16 '10 05:06

IsmailS


People also ask

How check ping in cmd is successful?

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.


2 Answers

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 
like image 21
paxdiablo Avatar answered Sep 20 '22 21:09

paxdiablo


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.

like image 151
Lukasz Avatar answered Sep 21 '22 21:09

Lukasz