【问题标题】:Batch Script to find out whether a host is up or down批处理脚本来确定主机是启动还是关闭
【发布时间】:2014-03-25 05:27:43
【问题描述】:

我需要扫描 IP 范围 172.18.x.x 到 172.25.x.x 的网络中的多个系统,并检查它们是否处于活动状态,然后将结果转储到文件中。 以下是脚本:

@echo off
for /L %%x in (18,1,25) do (
    for /L %%y in (1,1,254) do (
        for /L %%z in (1,1,254) do (

    ping -n 1 172.%x.%y.%z | find "Reply" > NUL
    IF NOT ERRORLEVEL 1 (set state=UP) ELSE (set state=DOWN)

    echo 172.%%x.%%y.%%z is %state% >> state.txt
)))

但是,即使某些 IP 地址未使用,结果也得出结论,每个系统都处于“启动”状态。

脚本有问题吗?

【问题讨论】:

  • ping -n 1 172.% 替换 ping -n 1 172.%x.%y.%z 后似乎在我的系统上运行良好%x.%%y.%%z 在脚本中。没有进行其他更改。

标签: windows batch-file


【解决方案1】:

是的。标准delayedexpansion 问题。这里有很多很多很多关于这个的例子。

在块语句(a parenthesised series of statements) 中,整个块被解析并然后执行。块中的任何 %var% 都将替换为该变量的值在解析块时 - 在块执行之前 - 同样适用于 FOR ... DO (block)

因此,IF (something) else (somethingelse) 将在遇到IF 时使用%variables% 的值执行。

解决此问题的两种常见方法是 1) 使用 setlocal enabledelayedexpansion 并使用 !var! 代替 %var% 来访问 var 的更改值或 2) 调用子例程以使用改变了值。

此外,由于您的批处理在终止时既不重置 state,也不使用 setlocal 在终止时自动清除对环境的更改,因此在后续运行时,使用先前设置的值 state(因此第一次,你会得到echo is off,然后是最后扫描的服务器的状态)

IF NOT ERRORLEVEL 1 (set state=UP) ELSE (set state=DOWN)

哦!这里的模糊思维 - 它正在变得普遍,而不仅仅是普遍。怎么了

IF ERRORLEVEL 1 (set state=DOWN) ELSE (set state=UP)

哪个更直接且不涉及双重否定?

解决方案 1:

@echo off
setlocal enabledelayedexpansion
for /L %%x in (18,1,25) do (
    for /L %%y in (1,1,254) do (
        for /L %%z in (1,1,254) do (

    ping -n 1 172.%%x.%%y.%%z | find "Reply" > NUL
    IF ERRORLEVEL 1 (set state=DOWN) ELSE (set state=UP)

    echo 172.%%x.%%y.%%z is !state! >> state.txt
)))

解决方案 2:

@echo off
for /L %%x in (18,1,25) do (
    for /L %%y in (1,1,254) do (
        for /L %%z in (1,1,254) do (

    ping -n 1 172.%%x.%%y.%%z | find "Reply" > NUL
    (
    IF ERRORLEVEL 1 (echo 172.%%x.%%y.%%z is DOWN
     ) ELSE (echo 172.%%x.%%y.%%z is UP
    )
    )>> state.txt
)))

【讨论】:

  • @joojaa 好收获!固定。
  • @Magoo - 我应该用“TTL”替换“回复”吗?当结果是-“来自 x.x.x.x 的回复:目标主机无法访问”时,它会产生问题
  • @MandarShinde :是的 - 进行替换。我假设您正在应用的测试做出了区分 - state 值的明显不变的报告是我关心的。
【解决方案2】:

这些天,Ping 自己返回一个错误级别:

@echo off
for /L %%x in (18,1,25) do (
    for /L %%y in (1,1,254) do (
        for /L %%z in (1,1,254) do (

ping -n 1 172.%%x.%%y.%%z > NUL
IF NOT ERRORLEVEL 1 (
       >> state.txt echo 172.%%x.%%y.%%z is UP
   ) else ( 
       >> state.txt echo 172.%%x.%%y.%%z is DOWN
)

)))

【讨论】:

  • @AndriyM 谢谢你 - 如果路由器响应你的链接中的错误消息,那么你没有连接,一切都会失败,对吗?
  • 是的,这是我的理解。我自己只有在 在本地网络中 ping 一个丢失/不存在的主机时才经历过这种情况。 (我的意思是,只是 ping 一些不存在的任意 192.168.1.123,192.168.1.* 是我的网络。)
猜你喜欢
  • 2013-05-06
  • 1970-01-01
  • 2018-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多