我需要扫描网络中 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 扫描器来完成这项工作。编写脚本似乎毫无意义,因为有许多其他工具可以完成相同的工作。