批处理脚本用于查明主机是否启动或关闭

批处理脚本用于查明主机是否启动或关闭

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

@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”状态。

脚本有问题吗?

答案1

脚本中的问题是关于批处理脚本的一个非常奇怪的事情。要使环境变量在 IF 或 FOR 中更新,您必须使用setlocal ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION!var!。如果您好奇,荒谬之处(如果您不将 setlocal 行包含在 !var! 中会发生什么)将在 中进一步解释set /?

setlocal ENABLEEXTENSIONS 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 NOT ERRORLEVEL 1 (set state=UP) ELSE (set state=DOWN)

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

如果你只想要那些已启动的。试试这个

setlocal ENABLEEXTENSIONS 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 -w 1000 172.%%x.%%y.%%z | find "Reply" > NUL
    IF NOT ERRORLEVEL 1 (
        set state=UP
        echo 172.%%x.%%y.%%z is !state! >> state.txt
    ) ELSE (
        set state=DOWN
    )
)))

答案2

我建议香料厂(我在看了你的问题后建议这样做https://networkengineering.stackexchange.com/questions/6993/tool-or-script-for-collecting-network-inventory)。您所需的所有详细信息都可以通过 spiceworks inventory 工具获得。它最适合 Windows AD,但也可以采用其他任何方式完成。

答案3

我不知道你要检查多少个系统。找到解决方案了这里..如果您发现这样做很容易,请接受这个答案......

For /f %%i in (testservers.txt) do ping -n 1 %%i >>state.txt

**在 testservers.txt 中包含所有 ip

答案4

我会使用类似的工具愤怒的 IP 扫描器来完成这项工作。编写脚本似乎毫无意义,因为有许多其他工具可以完成相同的工作。

相关内容