2016-10-11 1 views
0

現在、私はオフィス内のマシンをアップグレードする技術者のチームをサポートしており、オンラインマシンの量を把握する必要があります。FORループの次の反復までバッチファイル 'continue'

私は現在、マシン名のリストとバッチファイル(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 

問題は、一度ラインはそれだけで次の行に続けて、行われている「%%私がオフラインである」ということで、とにかくそれを削除します。

pingの結果が悪い場合、pingの下の3行をスキップしてリストの次の繰り返しを続ける方法はありますか?

注:私はServer 2008からWindows 8.1マシンにpingを実行しています。

答えて

2

最初の問題は、NULにリダイレクトされた出力で「TTL =」を見つけようとしていることです。そのリダイレクションを削除して、FINDが検索するものを取得するようにします。

2番目の問題はロジックエラーで、||句を実行しても他の行も実行されます。 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