批处理脚本以查明主机是启动还是关闭

时间:2014-03-25 05:27:44

标签: windows batch-file

我需要扫描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地址未被使用,每个系统都是“UP”。

脚本有问题吗?

2 个答案:

答案 0 :(得分:1)

是。标准delayedexpansion问题。关于这一点,有很多很多很多很多例子。

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

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

解决此问题的两种常见方法是1)使用IF并使用setlocal enabledelayedexpansion代替!var!来访问已更改的%var%或2}值以进行调用一个子程序,用于使用更改的值执行进一步处理。

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

state

哦!模糊思维在这里 - 而且它变得普遍,而不仅仅是普通的。

有什么问题
echo is off

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

解决方案1:

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

解决方案2:

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

答案 1 :(得分:0)

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
)

)))