2016-06-01 89 views
0

我正在嘗試編寫一個工作腳本,告訴我網絡上的哪些計算機處於聯機狀態,哪些計算機處於脫機狀態。從批處理中刪除值

目前我有它顯示在線/離線狀態,從一個文本文件的PC名稱作爲輸入到一個集變量。

我到目前爲止的代碼是:

@echo off 
setlocal EnableDelayedExpansion 

for /F "tokens=*" %%a in (VC.txt) do call :append %%a 

:ping 
for %%i in (%VC) do (
ping %%1 -n 1 >nul 
call :test %%i 
) 
echo. 
goto :ping 

:test 
IF %ERRORLEVEL% EQU 0 (
echo Pinging %1 
) else (
echo Off %1 
) 
goto :eof 

:append 
if defined VC (
set VC=%VC% %1 
) else (
set VC=%1 
) 

我希望發生的是一次計算機聯機,將其從名單中刪除。基本上只是顯示離線機器的列表。 這可能沒有擦拭整個設置,並創造新鮮?

+0

設計問題:只是因爲機器上線並不意味着它會保持在線狀態。幫助我理解爲什麼您不需要在任何輪詢間隔時間內重新掃描整個機器列表?補充想法:你需要保留「歷史」統計數據嗎?例如給定機器的平均正常運行時間,機器的總停機時間。在「批處理」文件中這樣做似乎是次優的,但你可能有一個很好的理由。無論如何,對不起,我無法幫助你確切的問題。 *聳聳肩*祝你好運。 – jgreve

+0

有兩個拼寫錯誤:'for %% i in(%VC)do' should read for for %% i in in(%VC%)do'(missing'%'sign),'ping %% 1 -n 1 '應該讀'ping %% i -n 1' ... – aschipfl

+0

@jgeve,該列表不斷被重新掃描以確保機器保持在線狀態。不,我不需要任何歷史。基本上我需要將文件複製到一臺機器上,這樣可以幫助我跟蹤它們。 –

回答

0

這個mod做你想要什麼:

:test 
IF %ERRORLEVEL% EQU 0 (
echo Pinging %1 
REM Remove this machine from the list 
set "VC=!VC: %1=!" 
) else (
echo Off %1 
) 
goto :eof 

然而,你必須在你的代碼一對夫婦的小錯誤。這是固定部分:

:ping 
for %%i in (%VC%) do (
ping %%i -n 1 >nul 
call :test %%i 
) 
echo. 
goto :ping 

一些問題與您的問題無關。如果機器名稱是單個單詞且沒有空格,則不需要for命令中的"tokens=*"部分。而且,所有這些call和子程序都使代碼複雜化。這是我會這樣做的方式:

@echo off 
setlocal EnableDelayedExpansion 

set "VC=" 
for /F %%a in (VC.txt) do set "VC=!VC! %%a" 

:ping 
for %%i in (%VC%) do (
    ping %%i -n 1 >nul 
    IF !ERRORLEVEL! EQU 0 (
     echo Pinging %%i 
     REM Remove this machine from the list 
     set "VC=!VC: %%i=!" 
    ) else (
     echo Off %%i 
    ) 
) 
echo/ 
if defined VC goto :ping 

echo All machines are on line 
+0

這正是我需要的。感謝堆。 –