
我需要掃描 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 庫存工具取得。
答案3
我不知道你要檢查多少個系統..找到了正確的解決方案這裡..如果您發現這樣做很容易,請接受這個答案...
For /f %%i in (testservers.txt) do ping -n 1 %%i >>state.txt
**在 testservers.txt 中包含所有 IP
答案4
我會使用類似的工具憤怒的IP掃描器來做這項工作。當有很多其他工具可以完成完全相同的事情時,編寫腳本似乎毫無意義。