2012-02-17 107 views
8

我正在尝试使用批处理文件来确认使用ping的网络连接。我想执行批处理运行,然后打印,如果ping成功或不成功。问题是,它作为一批运行时总是显示'失败'。这里是代码:批量ERRORLEVEL ping响应

@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'是我的电脑的名字。我正在让自己的计算机进行ping操作,以便消除连接不良的变量。正如我之前所说,批次总是导致失败。奇怪的是,如果我将代码复制到命令提示符下,程序工作正常。有谁知道为什么程序在命令提示符下工作正常,但不能作为批处理工作? 感谢

回答

2

我也不知道是什么FIND和设置错误级别之间的相互作用,但你可以做到这一点很容易:如果

@echo off 
for /f %%i in ('ping racer ^| find /c "(0%% loss)"') do SET MATCHES=%%i 
echo %MATCHES% 

这将打印0如果ping失败,1它成功了。我让它看起来只有“0%的损失”(不是特别的4点),所以可以定制ping的数量。

百分号已加倍,因此它不会被误认为应该被替换的变量。

FOR技巧只是简单地将命令的输出设置为环境变量的值。

+0

感谢您的帮助! [这](http://stackoverflow.com/questions/3050898/how-to-check-if-ping-responded-or-not-in-a-batch-file)链接是我开始这个项目,和它的示例使用FIND。 – LastStar007 2012-02-17 16:41:38

+0

它可能无法正常工作。例如当得到响应时,例如'Host unreachable' – moteus 2017-10-09 08:01:08

4

如果你要

echo "Packets: Sent = 4, Received = 4, Lost = 0 (0% loss)," 

,你会看到%被剥离。你需要逃离它作为%有一个批处理文件中有特殊的含义:

"Packets: Sent = 4, Received = 4, Lost = 0 (0%% loss)," 

但其易于使用TTL作为成功的指示;

.. | find "TTL" 
+0

我在另一篇文章中看到了关于使用“TTL”的内容,但是想避免它,因为有人说它可能会返回误报。 – LastStar007 2012-02-17 16:35:32

0

基于亚历克斯·K公司的注意,这对我的作品在Windows 7:

@echo off 
setlocal enableextensions enabledelayedexpansion 

for /f %%i in (PCS.TXT) do (
    SET bHOSTUP=0 
    ping -n 2 %%i |find "TTL=" > NUL && SET bHOSTUP=1 
    IF !bHOSTUP! equ 1 (
     CALL :HOSTUP %%i 
    ) else (
     CALL :HOSTDOWN %%i 
    ) 
) 
GOTO EOF 

:HOSTUP 
echo Host UP %1 
GOTO EOF 

:HOSTDOWN 
echo Host DOWN %1 
GOTO EOF 

:EOF 
exit /B 
4

测试为0%的损失可能会出现假阳性,在这种情况下: 比方说,你通常有一个网络驱动器上some_IP-address,你想知道它是否打开。

如果该驱动器是关闭的,而你平安some_IP地址,从中你ping IP地址,会回应:
Answer from your_own_IP-address: target host not reachable
... 0% loss

你或许可以在网络环境下使用if existif not exist会更好。

0

的所有

>@echo off 
>for /f %%i in ('ping racer ^| find /c "(0%% loss)"') do SET MATCHES=%%i 
>echo %MATCHES% 

先不工作。如果它不会失败,它会检测到0%,因为它有0%。 如果它失败了,也不起作用,因为它会有100%的损失,这意味着它发现了0%损失后面的部分(0%损失)

它是否检测到100%的损失所以:

>for /f %%i in ('ping -n 1 -l 1 %pc% ^| find /c "(100%% loss)"') do SET check=%%i 

错误级别可能会有点搞砸了,但它就像一个魅力:

>if '%check%'=='1' goto fail 
>if '%check%'=='0' echo %pc% is online.&goto starting 

1意味着失败 0意味着它成功

在我的脚本中是使用链接。 转到失败将去:在我的脚本失败,这将告诉我,%pc%(我将在开始时有用户输入)脱机,并将去另一次运行。

>:fail 
>color 0c 
>title %pc% is offline 
>echo %pc% is offline 
>PING -n 6 127.0.0.1>nul 
>goto choice 

我希望这会有所帮助。

1

最简单的解决这个我能想到的:

set error=failure 
ping racer -n 1 -w 100>nul 2>&1 && set error=success 

当然,-w需要调整,如果慢速链路上(100ms的可能是通过拨号太短;-))

关于

0

ping具有errorlevel输出值。成功是0,失败1 只是这样做:

C:\>ping 4.2.2.2 

Pinging 4.2.2.2 with 32 bytes of data: 

Reply from 4.2.2.2: bytes=32 time=28ms TTL=57 
Reply from 4.2.2.2: bytes=32 time=29ms TTL=57 
Reply from 4.2.2.2: bytes=32 time=30ms TTL=57 
Reply from 4.2.2.2: bytes=32 time=29ms TTL=57 

Ping statistics for 4.2.2.2: 
    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss), 
Approximate round trip times in milli-seconds: 
    Minimum = 28ms, Maximum = 30ms, Average = 29ms 

C:\>echo %errorlevel% 
0 

C:\>ping foo.bar 
Ping request could not find host foo.bar. Please check the name and try again. 

C:\>echo %errorlevel% 
1 

正如你可以看到有没有必要所有这些脚本矫枉过正。

+5

问题,我得到了%0的损失,这是如果主机未知,errorlevel只设置为1 - 如果ping一个没有响应的ip地址,它仍然返回0 – l0ft13 2014-03-26 12:22:29

+0

同意。以下是进一步描述的情况:'C:\> ping -n 1 172.25.0.1使用32个字节的数据Pinging 172.25.0.1:来自172.25.1.1的应答:目标主机不可达。 Ping的统计信息为172.25.0.1:数据包:发送= 1,收到= 1,丢失= 0(0%丢失),C:\> echo%errorlevel%0' – jdw 2015-10-31 12:42:11

1

,而不使用任何变量

ping racer -n 1 -w 100>nul || goto :pingerror 
... 

:pingerror 
echo Host down 
goto eof 

:eof 
exit /b 
0
set ErrorLevel=1 
(ping example.com -n 1 && set ErrorLevel=0)>nul 

ErrorLevel另一种变化是0如果exam​​ple.com是在线的,否则1

注意:仅在Win8上测试!

0

是的ping无法返回正确的错误级别。要检查网络连接,我用电脑“NET VIEW计算机名”,然后检查%ERRORLEVEL% - 简单和容易

+0

OP旨在实施一种连接质量测试 - ping几个答案并检查'0%损失'。 '净视图'不会这样做。 – Stephan 2015-06-24 06:38:15

16

更可靠的ping错误检查方法:

@echo off 
set "host=192.168.1.1" 

ping -n 1 "%host%" | findstr /r /c:"[0-9] *ms" 

if %errorlevel% == 0 (
    echo Success. 
) else (
    echo FAILURE. 
) 

该作品以检查是否字符串如69 ms314msping打印。

(Windows的翻译版本可能打印42 ms(与空间),因此我们检查。)

原因:

其他建议,如匹配time=TTL不可靠的,因为执行ping IPv6地址不显示TTL(至少不是我的Windows 7机器上)和翻译版本Windows可能会显示字符串time=的翻译版本。此外,不仅可以翻译time=,但有时它可能是time<而不是time=,如time<1ms的情况。

+2

'ms'也翻译成其他语言(例如俄语)。 – littleguga 2016-10-28 08:55:02

2
ping 198.168.57.98 && echo Success || echo failed 
+1

当你给出答案时,请提供更多信息。看到[回答] – 2017-03-03 14:57:57

+0

非常整洁的方法,我见过很多批次,但从来没有见过。不过,我会修改它更像'ping 198.168.57.98 -n 1> nul 2>&1 && echo Success ||回声失败'。荣誉 – jacktrader 2017-06-28 16:00:53