2015-01-05 97 views
2

尋找一個更好的方法來做到這一點,而不是我習慣的「手邊」方法,因爲這是一個必須經常進行的過程。清理批處理ping

我有一個IP範圍ping,從10.0.1.1510.0.50.15。第三個字節是指物理位置,最後一個八位字節是指該位置的設備。我需要查看哪些位置沒有將該設備連接到網絡。

我目前的解決辦法是:

FOR /L %i IN (1,1,50) DO ping -n 1 10.0.%i.15 >> C:\path\to\output\file.txt 

這讓我像輸出

Pinging 10.0.1.15 with 32 bytes of data: 
Reply from 10.0.1.15: bytes=32 time=68ms TTL=255 

Ping statistics for 10.0.1.15: 
    Packets: Sent = 1, Received = 1, Lost = 0 (0% loss), 
Approximate round trip times in milli-seconds: 
    Minimum = 68ms, Maximum = 68ms, Average = 68ms 

Pinging 10.0.2.15 with 32 bytes of data: 
Request timed out. 

Ping statistics for 10.0.2.15: 
    Packets: Sent = 1, Received = 0, Lost = 1 (100% loss), 
... 

我寧願輸出更象:

2 
... 

但說實話任何人類可讀的好 - 這不是在任何地方傳送。

在這種情況下,位置1有設備存在,但位置2沒有。

目前我所做的最好的解決方案是手動查看該文件並保持跟蹤。我可以在Python中一起破解一些東西,但它聽起來像是比它的價值更麻煩。我知道grep有一些顯示上下文的能力,但我在Windows上,除了基本的NT CLI工具之外,沒有其他任何權限。

有什麼方法可以利用findstr(或其他)來獲得更容易的人類可讀輸出嗎?例如有一些更好的方法電源外殼?

回答

2

當然。您可以使用find(或findstr,如果您願意)測試 「TTL」 「TTL =」(編輯:請參閱下面的MC ND的評論)的存在並使用得到的ERRORLEVEL來確定成功或失敗。

@echo off 
setlocal 

for /L %%I in (1,1,50) do (
    ping -n 1 10.0.%%I.15 | find /i "TTL=" >NUL && (
     echo 10.0.%%I.15: Online 
    ) || (
     echo 10.0.%%I.15: OFFLINE 
    ) 
) 

See this page對有條件執行(&&||東西)的更多信息。 find在成功時將ERRORLEVEL設置爲0,或者在失敗時設置爲1。如果你想登錄到一個txt文件,而不是控制檯的結果,只是包裝整個事情在另一個這樣括號代碼塊:

@echo off 
setlocal 

set "logfile=C:\path\to\output\file.txt" 

>> "%logfile%" (
    for /L %%I in (1,1,50) do (
     ping -n 1 10.0.%%I.15 | find /i "TTL=" >NUL && (
      echo 10.0.%%I.15: Online 
     ) || (
      echo 10.0.%%I.15: OFFLINE 
     ) 
    ) 
) 

type "%logfile%" 
+0

所以只列出其測試失敗會是這樣的'平的位置 - n 10.0%。%% I.15 | find/i「TTL」> NUL ||回聲的東西指示位置號碼在這裏?或者在我能指出一個「失敗」測試之前,我是否必須指出一個「通過」測試? –

+1

你可以指定'||如果你願意,沒有必要做任何事情。 – rojo

+2

'TTL expired'錯誤還包括'TTL'字符串。最好是測試TTL =' –