2015-04-29 26 views
2

我已經用在這個論壇發表unsuccesfully幾個腳本。 腳本如下:批量檢查可達機

@echo off 
for /f %%i in (computersTest.txt) do (
     ping -n 1 %%i | find "TTL" >nul 2>nul 
    Echo %errorlevel% 
) 

ERRORLEVEL始終爲0不管主機是否可達與否。如果我刪除> NUL查看輸出得到以下

Reply from 10.6.4.20: bytes=32 time<1ms TTL=64 
0 
0 
Reply from 10.6.5.58: bytes=32 time<1ms TTL=126 
0 

凡在列表中的第二臺主機不可達,但errolevel是0

如果我在命令提示符下執行

ping -n 1 XXXXXXXXX | find "TTL" >NUL 2>NUL 

echo %errorlevel%

給1

我做不知道我做錯了

TIA 拉蒙

回答

2

批次線或線(圓括號行)的塊首先解析,然後執行。在分析階段,所有的讀取上的變量操作從代碼去除,在開始執行線/塊之前與可變內的值替換。所以,如果一個變量在一個行/塊內被改變,這個新值不能從同一行/塊內被檢索,因爲沒有讀操作來檢索新值。

您可以使用它延遲擴展和改變(在需要的地方)從%var%語法爲!var!,以指示讀操作必須被延遲,直到該命令執行

在你的情況

解析器解決
@echo off 
setlocal enabledelayedexpansion 
for /f %%i in (computersTest.txt) do (
    ping -n 1 %%i | find "TTL=" >nul 2>nul 
    Echo %%i - !errorlevel! 
) 

note:ipv4響應中的正確測試是搜索TTL=,因爲在TTL過期錯誤的情況下可能有誤報。

但在檢查errorlevel變量的情況下,有更多的選擇(如果適用)。

您可以使用本機if errorlevel n這裏的條件會被評估爲true任何錯誤級別等於或大於n

@echo off 
for /f %%i in (computersTest.txt) do (
    ping -n 1 %%i | find "TTL=" >nul 2>nul 
    if errorlevel 1 (echo %%i offline) else (echo %%i online) 
) 

或者您可以使用條件執行。運營商&&||將允許包括執行什麼取決於來自先前命令的錯誤級別(未設置或設置)

@echo off 
for /f %%i in (computersTest.txt) do (
    (ping -n 1 %%i | find "TTL=" >nul 2>nul) && echo %%i online || echo %%i offline 
)