batch-file - 批量检查可达机器

标签 batch-file ping errorlevel

我已经使用了这个论坛上发布的几个脚本,但没有成功。 脚本如下:

@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/

相关文章:

batch-file - 回显命令后可能在 BATCH 文件中闪烁光标?

c++ - 智能感知:错误 C2440: '=':无法从 'unsigned long (__stdcall *)(const char *)' 转换为 'IPAddr'

docker - 无法从一个 Docker 容器 ping 到另一个

batch-file - .bat 文件中嵌套的 %errorlevel% 的错误值

cmd - Windows XP 中子进程的退出代码 "lost",而不是 Windows Server 2003 中的子进程

batch-file - cmd.exe %errorlevel% 9009 的官方 MS 引用

batch-file - 如何删除*.*(不包括某些扩展名)?

Windows 相当于 Linux 命令 grep -A(返回搜索字符串后的行)

java - 从批处理文件中的 Java 应用程序获取退出代码

java - Ping 以检查与域的连接