2016-06-01 11 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

2つのタイプミスがあります: '%VC' do '(%VC%)do( '%'記号がありません)の '%% iのために'を読み、' 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

これは私が必要としていたものです。ありがとう。 –

関連する問題