2014-03-25 20 views
0

我需要在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 
))) 

但是,結果得出結論,每一個系統是「UP」即使一些IP地址使用。

腳本的任何問題?

+0

似乎被更換後,我的系統工作正常* * ping -n 1 172.%x。%y。%z ** with ** ping -n 1 172。%% x。%% y。%% z **在腳本中。沒有其他改變。 – r3ap3r

回答

1

是的。標準delayedexpansion的問題。這裏有很多很多很多的例子。

在塊語句(a parenthesised series of statements),所述整個塊被解析並然後執行。該塊內的任何%var%將在該塊被解析時由該變量的值取代 - 在塊執行之前 - 同樣的事情適用於FOR ... DO (block)

因此,在遇到IF時,將使用%variables%的值執行IF (something) else (somethingelse)。克服這個

兩種常用方法是:1)使用setlocal enabledelayedexpansion並使用!var!代替%var%訪問的var改變的值或2),以調用一個子程序使用改變的值來執行進一步的處理。

此外,因爲您的批處理既不重置state終止時也不使用setlocal自動清除的變化對終端的環境,在隨後的運行中,先前設置的state值用於(因此是第一次,你'd得到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 
))) 
+1

ping中的%加倍 – joojaa

+0

@joojaa好抓!固定。 – Magoo

+0

@Magoo - 我應該用「TTL」替換「Reply」嗎? 當結果是 - 「從x.x.x.x回覆:目標主機無法訪問」時,會產生問題 –

0

平本身會返回一個錯誤級別,這些天:

@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 
) 

))) 
+0

[Errorlevel = 0可能並不總是表示主機已啓動](http://stackoverflow.com/a/5039117)。 –

+0

@AndriyM感謝你 - 如果路由器在你的鏈接中迴應錯誤信息,那麼你沒有連通性,一切都會失敗,是嗎? – foxidrive

+0

是的,這是我的理解。我本人只在本地網絡*內ping缺少/不存在的主機*時才遇到過這種情況。 (我的意思是,只是ping一些不存在的任意192.168.1.123,192.168.1。*是我的網絡。) –

相關問題