批量检查可达机器

问题描述 投票:0回答:2

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

@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 拉蒙

batch-file ping errorlevel
2个回答
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! )

注意

: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
)



0
投票
ERRORLEVEL

设置的

ping
是徒劳的,因为在某些情况下,即使它没有收到来自远程主机的任何有效回复,它也会将
ERRORLEVEL
设置为
0
(成功)!!! 但是,下面描述的方法是可靠的、可移植的并且适用于:

翻译成所有其他语言,例如:“ms”、“TTL”、“回复”、“丢失”、“无法到达”、“已收到”等...,包括俄语和中文。
  1. Ping IPv4 地址。
  2. Ping IPv6 地址(无
  3. TTL
  4. 字段)
    发生错误
  5. “一般故障”
  6. 的情况。 Ping 一个地址,返回
  7. “请求超时。”
  8. Ping 地址时返回
  9. “目标主机无法访问。”
  10. Ping 可解析的字母数字主机。
  11. Ping 无法解析的字母数字主机,这会导致返回
  12. “Ping 请求无法找到主机 UnresolvableHost...”
  13. 错误。
  14. @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

	
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.