2012-09-13 16 views
5

バッチのみを使用する必要があります。基本的に、HOSTNAMESサーバーはすべてtxtファイルにリストされています。私は次のコードを使用してすべてのサーバーにpingを実行し、その結果をtxtfileに表示しました。バッチスクリプトを使用して複数のサーバにpingを実行し、IPアドレスとホスト名を返す方法は?

For /f %%i in (testservers.txt) do ping -n 1 %%i >>pingtest.txt 

上記のすべてのサーバーがpingされました。今、IPアドレスとHOST名を別々のファイルに出力したいと思います。これどうやってするの? 私は "TTL"のような単語を検索して、3番目のトークン(IPの場合)と2番目のトークン(HOSTNAME)の "PINGING"のような単語を探すforループを実行できることを知っています。しかし、私は間違いがあり、それを正しく表示することはできません。 IPとホスト名を別のファイルに出力する理由は、DOWNとUPのリストを作成することです。

お願いします。 :)

EDIT:ちょっと混乱しない、3つの異なるファイルがあることを皆さんに知らせたい、testservers.txtにHOSTNAMESがあり、pingtest.txtにping結果があり、result.txtには現在のステータスがDOWNまたはUPのホスト名と一緒にIPを送信します。

+0

http://stackoverflow.com/questions/3050898/how-to-check-if-ping-responded-or -not-in-a-batch-fileはあなたに役立つはずです – SeanC

答えて

19

あなた自身のコードを投稿して訂正することはできませんでしたが残念です。
とにかく、ここではこれを私自身のソリューションです:

@echo off 
setlocal enabledelayedexpansion 

set OUTPUT_FILE=result.txt 
>nul copy nul %OUTPUT_FILE% 
for /f %%i in (testservers.txt) do (
    set SERVER_ADDRESS=ADDRESS N/A 
    for /f "tokens=1,2,3" %%x in ('ping -n 1 %%i ^&^& echo SERVER_IS_UP') do (
     if %%x==Pinging set SERVER_ADDRESS=%%y 
     if %%x==Reply set SERVER_ADDRESS=%%z 
     if %%x==SERVER_IS_UP (set SERVER_STATE=UP) else (set SERVER_STATE=DOWN) 
    ) 
    echo %%i [!SERVER_ADDRESS::=!] is !SERVER_STATE! >>%OUTPUT_FILE% 
) 

ping出力を解析し、ホストと内部ループを通じて外部ループ反復します。最初の2つのifステートメントは、IPアドレス解決の2つの可能なケースを処理します。

  1. ホスト名はホストIPアドレスです。
  2. ホストのIPアドレスは、その名前から解決できます。

ホストIPアドレスを解決できない場合、アドレスは「アドレスなし」に設定されます。

これが役に立ちます。

+0

+1 - 私はそれが好きです。コードは言語に依存します。英語以外の言語の場合は変更する必要があります。 – dbenham

+0

フランス語/ドイツ語/オランダ語版の「ping」があると思いますか? –

+2

絶対に! [このスレッド](https://www.itefix.no/i2/content/problem-checkwinpingexe)にはドイツ語、ポルトガル語、フランス語、ポーランド語のサンプル出力がありますか? – dbenham

4

名前と結果が異なる行にあるため、各HOST名と結果のpingtest.txtをバッチで解析するのは困難です。

ファイルにリダイレクトするのではなく、各PINGコマンドの結果(返されたエラーコード)を直接テストするほうがはるかに簡単です。また、構造全体を括弧で囲み、最終出力を1回だけリダイレクトする方が効率的です。

>result.txt (
    for /f %%i in (testservers.txt) do ping -n 1 %%i >nul && echo %%i UP||echo %%i DOWN 
) 
+0

ニートですが、これはIPアドレスを抽出しないので、pingを 'nul'にリダイレクトせずに解析する必要があります。とにかく+1。 –

+1

+1非常にエレガントです。 –

0

pingの問題は、ホストが生きていない場合、pingのホストが使用できないという応答をローカルマシンが返します。したがって、pingのエラーコードは0になり、コードは認識されないためエラーになります。ダウン状態になる。より良い

このよう

ping -n 4 %1 | findstr TTL 
if %errorlevel%==0 (goto :eof) else (goto :error) 

にこのあなたはよくやっピング結果に常にある、典型的な文字列のTTLを探して、このfindstrの上のエラーをチェックする方法の代わりに、pingの全体的な

これを刺激し、それを行います次のようになります。

@echo off 
SetLocal 


set log=path/to/logfile.txt 
set check=path/to/checkfile.txt 

:start 
echo. some echo date >>%log% 

:check 
for /f %%r in (%check%) do (call :ping %%r) 
goto :eof 

:ping 
ping -n 4 %1 | findstr TTL 
if %errorlevel%==0 (goto :eof) else (goto :error) 

:error 
echo. some errormessage to >>%log% 
echo. some blat to mail? 

:eof 
echo. some good message to >>%log% 
0

この

をお試しください
+0

あなたのスクリプトはbashです。質問は* batch *についてです。 –

+0

@EitanT、それはBashではなく、Powershellです。 – Suncatcher

+0

@Suncatcher私は訂正した。それでも、問題の要件はバッチのみです... –

0

私はコードエイタン-Tで早く与えられ、CSVファイルへの出力に再加工に取り組みました。以前のコードの結果が正しい値を与えているとは限らないので、改善しました。

testservers.txt

SOMESERVER 
DUDSERVER 

results.csv

HOSTNAME LONGNAME     IPADDRESS STATE 
SOMESERVER SOMESERVER.DOMAIN.SUF  10.1.1.1 UP 
DUDSERVER UNRESOLVED     UNRESOLVED DOWN 

Pingtest.batを

@echo off 
    setlocal enabledelayedexpansion 
    set OUTPUT_FILE=result.csv 

    >nul copy nul %OUTPUT_FILE% 
    echo HOSTNAME,LONGNAME,IPADDRESS,STATE >%OUTPUT_FILE% 
    for /f %%i in (testservers.txt) do (
     set SERVER_ADDRESS_I=UNRESOLVED 
     set SERVER_ADDRESS_L=UNRESOLVED 
     for /f "tokens=1,2,3" %%x in ('ping -n 1 %%i ^&^& echo SERVER_IS_UP') do (
     if %%x==Pinging set SERVER_ADDRESS_L=%%y 
     if %%x==Pinging set SERVER_ADDRESS_I=%%z 
      if %%x==SERVER_IS_UP (set SERVER_STATE=UP) else (set SERVER_STATE=DOWN) 
     ) 
     echo %%i [!SERVER_ADDRESS_L::=!] !SERVER_ADDRESS_I::=! is !SERVER_STATE! 
     echo %%i,!SERVER_ADDRESS_L::=!,!SERVER_ADDRESS_I::=!,!SERVER_STATE! >>%OUTPUT_FILE% 
    ) 
0

セットWORKDIR = {あなたの作業ディレクトリをオフ@echo。例えば ​​- C:\作業} セットIPLIST =%WORKDIR%\ IP-list.txtに

setlocal enabledelayedexpansion 
set OUTPUT_FILE=%workdir%\result.csv 

>nul copy nul %OUTPUT_FILE% 
echo HOSTNAME,LONGNAME,IPADDRESS,STATE >%OUTPUT_FILE% 
for /f %%i in (%iplist%) do (
    set SERVER_ADDRESS_I=UNRESOLVED 
    set SERVER_ADDRESS_L=UNRESOLVED 
    for /f "tokens=1,2,3" %%x in ('ping -a -n 1 %%i ^&^& echo SERVER_IS_UP') do (
    if %%x==Pinging set SERVER_ADDRESS_L=%%y 
    if %%x==Pinging set SERVER_ADDRESS_I=%%z 
     if %%x==SERVER_IS_UP (set SERVER_STATE=UP) else (set SERVER_STATE=DOWN) 
    ) 
    echo %%i [!SERVER_ADDRESS_L::=!] !SERVER_ADDRESS_I::=! is !SERVER_STATE! 
    echo %%i,!SERVER_ADDRESS_L::=!,!SERVER_ADDRESS_I::=!,!SERVER_STATE! >>%OUTPUT_FILE% 
) 
+0

あなたの答えがどのように問題を解決したかを説明してください。皆さんの解答をより明確に理解し、将来の参考に役立ててください。 – Aziz

0

これは私がちょうど ホスト名を解決するためにpingを実行するには、-aオプションを追加する素晴らしい仕事しました。おかげhttps://stackoverflow.com/users/4447323/wombat

@echoオフ SETLOCAL enabledelayedexpansionを セットOUTPUT_FILE = result.csv

>nul copy nul %OUTPUT_FILE% 
echo HOSTNAME,LONGNAME,IPADDRESS,STATE >%OUTPUT_FILE% 
for /f %%i in (testservers.txt) do (
    set SERVER_ADDRESS_I=UNRESOLVED 
    set SERVER_ADDRESS_L=UNRESOLVED 
    for /f "tokens=1,2,3" %%x in ('ping -n 1 -a %%i ^&^& echo SERVER_IS_UP') do (
    if %%x==Pinging set SERVER_ADDRESS_L=%%y 
    if %%x==Pinging set SERVER_ADDRESS_I=%%z 
     if %%x==SERVER_IS_UP (set SERVER_STATE=UP) else (set SERVER_STATE=DOWN) 
    ) 
    echo %%i [!SERVER_ADDRESS_L::=!] !SERVER_ADDRESS_I::=! is !SERVER_STATE! 
    echo %%i,!SERVER_ADDRESS_L::=!,!SERVER_ADDRESS_I::=!,!SERVER_STATE! >>%OUTPUT_FILE% 
) 
関連する問題