我使用了这个论坛上发布的几个脚本,但没有成功。 脚本如下:
@echo off
for /f %%i in (computersTest.txt) do (
ping -n 1 %%i | find "TTL" >nul 2>nul
Echo %errorlevel%
)
无论主机是否可达,Errorlevel 始终为 0。如果我删除 >nul 以查看输出,我会得到以下内容
Reply from 10.6.4.20: bytes=32 time<1ms TTL=64
0
0
Reply from 10.6.5.58: bytes=32 time<1ms TTL=126
0
列表中的第二个主机无法访问,但错误级别为 0
如果我在命令提示符下执行
ping -n 1 XXXXXXXXX | find "TTL" >NUL 2>NUL
echo %errorlevel%
给1
我不知道我做错了什么
TIA 拉蒙
首先解析批处理行或行块(括号内的行),然后执行。在解析阶段,对变量的所有读取操作都将从代码中删除,并替换为开始执行行/块之前变量内的值。因此,如果变量在行/块内更改,则无法从同一行/块内检索该新值,因为没有读取操作来检索新值。 您可以使用延迟扩展和(在需要时)将语法从
%var%
更改为
!var!
来解决它,以向解析器指示读取操作必须延迟到命令执行为止就你而言
@echo off
setlocal enabledelayedexpansion
for /f %%i in (computersTest.txt) do (
ping -n 1 %%i | find "TTL=" >nul 2>nul
Echo %%i - !errorlevel!
)
:ipv4 中响应的正确测试是搜索 TTL=
,因为如果出现 TTL 过期错误,您可能会出现误报。
但是在检查
errorlevel
变量的情况下,还有更多替代方案(如果适用)。
您可以使用本机
if errorlevel n
,其中对于任何等于或大于
n
的错误级别,条件将被评估为 true
@echo off
for /f %%i in (computersTest.txt) do (
ping -n 1 %%i | find "TTL=" >nul 2>nul
if errorlevel 1 ( echo %%i offline ) else ( echo %%i online )
)
或者您可以使用条件执行。运算符
&&
和
||
将允许根据上一个命令的错误级别(未设置或设置)包含要执行的内容@echo off
for /f %%i in (computersTest.txt) do (
( ping -n 1 %%i | find "TTL=" >nul 2>nul ) && echo %%i online || echo %%i offline
)
ERRORLEVEL
设置的
ping
是徒劳的,因为在某些情况下,即使它没有收到来自远程主机的任何有效回复,它也会将 ERRORLEVEL
设置为 0(成功)!!! 但是,下面描述的方法是可靠的、可移植的并且适用于:
翻译成所有其他语言,例如:“ms”、“TTL”、“回复”、“丢失”、“无法到达”、“已收到”等...,包括俄语和中文。
TTL
@echo off
for /F %%A in ('ping %1 -n 1 ^| findstr /C:^= ^| find /c /v ""') do (set "res=%%A")
if %res% GEQ 3 (
echo SUCCESS.
) else (
echo FAILURE.
)
如果将上面的代码保存到名为例如
pingtest.bat
,你可以这样使用它:
pingtest 192.168.1.1
此方法利用了字符串中存在的等号
bytes=
,这些等号不受翻译为其他语言的影响,并且不会出现在不成功的 ping/echo 结果中。
此外,将开关-n 1
修改为例如
-n 6
允许您在变量 %res%
中获得反映连接质量的定性结果。使用下面的代码,您可以标准化变量%res%
中的结果,使其在失败时变为
0
...以及在成功时 - 成功 ping 的数量:@echo off
for /F %%A in ('ping %1 -n 6 ^| findstr /C:^= ^| find /c /v ""') do (set "res=%%A")
if %res% GEQ 3 (
set /A "res=%res%-2"
) else (
set "res=0"
)
echo The number of successful pings is %res%
要暂停程序直到成功 ping 通主机,只需像这样循环调用它:
@echo off
:loop
for /F %%A in ('ping %1 -n 1 ^| findstr /C:^= ^| find /c /v ""') do (set "res=%%A")
if %res% LSS 3 goto :loop