1

以下のコードは、コンピューター名とIPアドレスをファイルに書き込みますが、その横に失敗してpingできないコンピューターの名前も書き込みたいと思います。これを行うためにバッチファイルをどのように変更するかわかりません。

@echo off

Echo Pinging list...

set ComputerList=list.txt

Echo Computername,IP Address>Final.csv
setlocal enabledelayedexpansion

for /f "usebackq tokens=*" %%A in ("%ComputerList%") do (
for /f "tokens=3" %%B in ('ping -n 1 -l 1 %%A ^|findstr Reply') do (
set IPadd=%%B
echo %%A,!IPadd:~0, -1!>>Results.csv
))

pause
4

2 に答える 2

3

findstr'Reply'が見つからない場合は、 によって設定されたエラーレベルを使用して戻り文字列を置き換えることができます。

('ping -n 1 -l 1 %%A ^|findstr Reply ^|^| echo Not found Failed:')  

ここで(とのコンテキスト||のためにここでエスケープされている)は、前のコマンドが失敗した場合にのみ実行することを意味します。for^

ping補足として、メッセージはシステム言語に依存する(OSの言語に翻訳される)ため、成功インジケーターとしての「返信」は英語バージョンでのみ機能することに注意してください。

于 2012-12-12T13:39:50.263 に答える
0

これは直接あなたが探しているものではないかもしれませんが、私は同様のタスクを持っていました:pingを実行し、成功または失敗を報告します。IPアドレスの抽出はあなたに任せます-あなたがすでにそれを行っているのを見てください。

pingの問題は、名前解決時に成功を返すことです。パケットが失われたか、ホストに到達できないか(0%の損失が報告されます)は関係ありません。

FOR %%a IN (
 google.com
 a.b.c.d
) DO @FOR /F "delims=" %%p IN (
     'PING -w 100 -n 1 %%a ^| findstr ^"Reply Request fail name^"'
   ) DO @(
     ECHO "%%p" | FINDSTR TTL >2 && echo %%a, success, %%p || echo %%a, failed, %%p
   ) >> Results.csv

ロジック:一度pingを実行し、リストされている単語の1つを含む行のみをフィルタリングします。結果のラインにTTLが存在する場合(出力の汚染を回避するためにSTDERRまたはNULに出力)、エコーは成功します。それ以外の場合、エコーは失敗します。

私は英語のWindowsを使用していますが、他の言語に合わせて単語を調整する必要があります。

編集:

FOR %%a IN (
 google.com
 a.b.c.d
) DO @FOR /F "delims=" %%p IN ('PING -n 1 %%a ^| findstr TTL ^|^| echo Failed') DO @(
       ECHO "%%p" | FINDSTR TTL >2 && (for /f "tokens=3" %%b IN ("%%p") do @echo %%a, %%b) || echo %%a, failed, %%p
     )

言語への依存度が低く、IPv4でのみ機能し、IP抽出が追加されています。TTLのping出力をフィルタリングし、TTLが見つからない場合は出力を「失敗」に設定します。出力文字列にTTLが含まれている場合は、IPを抽出し、ホストとIPをエコーし​​ます。それ以外の場合は、ホスト名と出力文字列をエコーし​​ます。

于 2018-01-31T11:24:15.910 に答える