我在这个论坛中使用了几个不成功的脚本。 脚本如下:
@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
列表中的第二个主机无法访问但errolevel为0
如果我在命令提示符下执行
ping -n 1 XXXXXXXXX | find "TTL" >NUL 2>NUL
echo %errorlevel%
给出1
我不知道自己做错了什么
TIA Ramon的
答案 0 :(得分:2)
首先解析批处理行或行块(括在括号中的行)然后执行。在解析阶段,对变量的所有读取操作都将从代码中删除,替换为变量中的值开始执行行/块之前。因此,如果在行/块内更改变量,则无法从同一行/块内检索此新值,因为没有读取操作来检索新值。
您可以使用延迟扩展并将%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!
)
note :ipv4中对响应的正确测试是搜索TTL=
,因为如果TTL过期错误,您可能会出现误报。
但是在检查errorlevel
变量的情况下,还有更多选择(如果它们适用)。
对于任何等于或大于if errorlevel n
n
@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
)