I'm trying to use a batch file to confirm a network connection using ping. I want to do batch run and then print if the ping was successful or not. The problem is that it always displays 'failure' when run as a batch. Here is the code:
@echo off
cls
ping racer | find "Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),"
if not errorlevel 1 set error=success
if errorlevel 1 set error=failure
cls
echo Result: %error%
pause
'racer' is the name of my computer. I'm having my computer ping itself so I can eliminate the variable of a poor connection. As I said before, the batch always results in failure. Oddly enough, the program works fine if I copy the code into the command prompt. Does anyone know why the program works fine in the command prompt but doesn't work as a batch? Thanks
I 'm not exactly sure what the interaction between
FIND
and setting the error level is, but you can do this quite easily:This prints
0
if the ping failed,1
if it succeeded. I made it look for just "0% loss" (not specifically 4 pings) so that the number of pings can be customized.The percent sign has been doubled so that it's not mistaken for a variable that should be substituted.
The
FOR
trick serves simply to set the output of a command as the value of an environment variable.ping has an errorlevel output value. Success is 0, failure is 1. Just do this:
As you can see there is no need for all this scripting overkill.
A more reliable
ping
error checking method:This works by checking whether a string such as
69 ms
or314ms
is printed byping
.(Translated versions of Windows may print
42 ms
(with the space), hence we check for that.)Reason:
Other proposals, such as matching
time=
orTTL
are not as reliable, because pinging IPv6 addresses doesn't showTTL
(at least not on my Windows 7 machine) and translated versions of Windows may show a translated version of the stringtime=
. Also, not only maytime=
be translated, but sometimes it may betime<
rather thantime=
, as in the case oftime<1ms
.The most simple solution to this I can think of:
Of course, -w needs to be adjusted if on a slow link (100ms might be too short over Dialup ;-))
regards
Testing for 0% loss may give a false positive, in this scenario: Let's say you normally have a network drive on some_IP-address, and you want to find out whether or not it's on.
If that drive is off, and you ping some_IP-address, the IP address from which you ping, will respond:
Answer from your_own_IP-address: target host not reachable
... 0% loss
You might be better off using
if exist
orif not exist
on that network location.