我已经使用了这个论坛上发布的几个脚本,但没有成功。 脚本如下:
@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
回显%errorlevel%
给出 1
我不知道自己做错了什么
TIA 雷蒙
最佳答案
首先解析批处理行或行 block (括号内的行),然后执行。在解析阶段,所有对变量的读取操作都会从代码中删除,并替换为在开始执行行/ block 之前变量内的值。因此,如果变量在行/ block 内更改,则无法从同一行/ block 内检索此新值,因为没有读取操作来检索新值。
您可以使用延迟扩展并在需要时将语法从 %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
变量的情况下,还有更多替代方案(如果适用)。
您可以使用 native 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
)
关于batch-file - 批量检查可达机器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29935515/