2017-01-10 5 views
1

コンピュータと呼ばれるファイルからIPアドレスを取得する.cmdファイルを使用して自動pingテストを作成しようとしています。それは大部分のために働くように見えるが、最初の後のすべてのpingテストは否定的または死んで戻ってくる。
A picture of the results自動Pingテストエラー

@echo off 
set fnm=C:\Users\jelliott\Desktop\computers.txt 
set lnm=C:\Users\jelliott\Desktop\results.txt 

if exist %fnm% goto Label1 

echo. 
echo Cannot find %fnm% 
echo. 
Pause 
goto :eof 

:Label1 
echo PingTest STARTED on %date% at %time% > %lnm% 
echo ================================================= >> %lnm% 
echo. 
for /f %%i in (%fnm%) do call :Sub %%i 
echo. 
echo ================================================= >> %lnm% 
echo PingTest ENDED on %date% at %time% >> %lnm% 
echo ... now exiting 
goto :eof 

:Sub 
echo Testing %1 
set state=alive 
ping -n 1 %1 
if errorlevel 1 set state=dead 
echo %1 is %state% >> %lnm% 
+0

このスクリプトを見てください:[テキストファイルのIPアドレスに基づいてコマンドを実行する](http://stackoverflow.com/questions/41102657/run-command-based-on-ip-address-from-text-ファイル?answertab =アクティブ#タブトップ) – Hackoo

+0

愚かな質問ですが、あなたの出力から、あなたはIPアドレスではなくマシン名を読んでいます。名前解決が機能していることを確認しましたか? –

+0

バッチデバッグへの最初のステップ:**ファイルの先頭から '@echo off'を取り除き、エラーを読みます。**その行はデバッグ情報を抑制しています。バッチファイル全体。 –

答えて

0

これが問題の原因が、ping要求後にエラーレベルであれば、私は知らないが信頼できるものではありません。それは常にpingが成功した後、0に設定されていません。成功したpingを確認する最も信頼できる方法は、pingコマンドの出力で「TTL =」を検索することです。成功したpingの出力には、常にping応答のTTLが含まれます。それ以外の場合、出力は "TTL ="になりません。
ではなく、このコマンドのエラーレベルを確認します。

ping -n 1 %1 | find "TTL=" 

findは、いくつかのテキスト文字列リテラルを検索することができます。エラーレベルが見つかると0に設定し、それ以外の場合は1に設定します。 findの代わりにfindstrを使用することもできます。

EDIT:これは、pingしているアドレスがIPv4の場合にのみ表示されます。 IPv6アドレスの場合、エラーレベルは正しく設定されています。 IPv6の場合、TTLは印刷されないので、pingが成功したかどうかを確認するためにerrorlevelを使用する必要があります。 [ここで] pingが成功したかどうかを確認する一般的な方法(IPv4またはIPv6のいずれか)を見つけることができます。発言とリンクについてはMC NDありがとうございます。 IPv4またはIPv6を強要したい場合は、または-6フラグをそれぞれpingとすることができます。

+1

'TTL ='( 'TTL'文字列を含むエラーがあります)をチェックする方が良いでしょう。 ipv4アドレス。(more [here](http://stackoverflow.com/a/27748080/2861476) –

+0

ありがとう! –

+0

それはまだ動作しませんでした。私は最初のpingの後、 1つは生きている、それはバイト時間などの返信を与えるが、それ以外の場合は単純に "何のIP"をチェックすると言う – JacobElliott

関連する問題