2016-10-11 81 views
0

我目前正在支持一組正在升級辦公室機器的技術人員,我需要跟蹤在線機器的數量。批處理文件'繼續'到FOR循環中的下一次迭代

目前我所擁有的是帶有機器名稱列表和批處理文件(OfficeName.bat)的文本文件(OfficeName.txt)。

我想要發生的事情是讓它遍歷機器列表並ping通它們。
如果ping成功,則從列表中刪除名稱並將計數器加1,如果不成功,則轉到列表中的下一臺計算機。

我遇到的問題是,如果一臺機器的ping結果返回「無法找到主機」,它仍然將errorlevel設置爲0,所以我不能使用IF/ELSE。

我現在的嘗試是這樣的:

@echo off 

setlocal EnableDelayedExpansion 

set /a counter=0 
set "NVC=" 

for /F %%a in (%~n0.txt) do set "NVC=!NVC! %%a" 

:ping 
for %%i in (%NVC%) do (
    ping %%i -n 1 >nul | find "TTL=" >nul || echo. %%i is offline. 
    set /a counter+=1 
    echo %%i is online 
    set "NVC=!NVC: %%i=!" 
) 
cls 
echo. %counter% machines are online. 
if defined NVC goto :ping 

echo All machines in %~n0 are online. 
pause 

的問題是,一旦「%% i是離線」線完成後,它只是延續到下一行,反正刪除。

如果ping結果不好,有沒有辦法跳過ping下面的3行,然後繼續列表中的下一次迭代?

注意:我從Server 2008運行此程序,ping Win 8.1計算機。

回答

2

您的第一個問題是,您正在嘗試在已重定向到NUL的輸出中查找「TTL =」。刪除該重定向,以便FIND獲取要搜索的內容。

第二個問題是邏輯錯誤,即使您執行||子句,其他行也在執行。您需要使用ELSE或其他IF子句。

最後,我認爲你正在過分地處理你的IP地址列表。

試試這個,看看它是否有意義。

@echo off & setlocal 

set /a counteron=0 
set /a counteroff=0 

for /f %%i in (%~n0.txt) do (
    ping %%i -n 1 | find "TTL=" >nul 
    if errorlevel 1 (
     set /a counteroff+=1 
     echo %%i is offline. 
    ) else (
     set /a counteron+=1 
     echo %%i is online 
    ) 
) 

echo. 
echo %counteron% machines are online. 
echo %counteroff% machines are offline. 
+0

其實你可以用'if!errorlevel! GEQ 1'由'如果ErrorLevel 1'等同,所以不再需要延遲擴展... – aschipfl

相關問題