web-dev-qa-db-ja.com

バッチスクリプトを使用して複数のサーバーにpingし、IPアドレスとホスト名を返す方法は?

したがって、私はバッチのみを使用する必要があります。基本的に、サーバーのHOSTNAMESはすべてtxtファイルにリストされています。次のコードを使用してすべてのサーバーをpingし、その結果をtxtfileに表示しました。

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

上記はすべてのサーバーにpingを実行しました。次に、IPアドレスとホスト名を別のファイルに出力します。これどうやってするの? forループを実行して「TTL」などの単語を検索し、3番目のトークン(IPの場合)と2番目のトークン(HOSTNAME)の「PINGING」のような単語を検索できることはわかっています。しかし、エラーが発生し、正しく表示できません。 IPとホスト名を別のファイルに出力したいのは、ダウンサーバーとアップサーバーのリストを作成するためです。

助けていただければ幸いです。 :)

編集:混乱しないように、3つの異なるファイルがあることを皆さんに知らせたかったので、testservers.txtにはHOSTNAMESがあり、pingtest.txtにはping結果があり、result.txtにはIPとホスト名が含まれます現在のステータスはDOWNまたはUPです。

6
Gutsygibbon

まあ、残念なことに、自分でコードを投稿しなかったので、修正できました。
とにかく、これは私自身のこれに対する解決策です:

@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アドレスを解決できない場合、アドレスは「ADDRESS N/A」に設定されます。

お役に立てれば。

19
Eitan T

名前と結果が別の行にあるため、バッチを使用してホスト名と結果ごとにpingtest.txtを解析することは困難です。

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

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

これを試して

$servers = Get-Content test.txt

$reg=""

foreach ($server in $servers) 

{

$reg=$reg+$server+"`t"+([System.Net.Dns]::GetHostAddresses($server) | foreach {echo $_.IPAddressToString})+"`n"

 }
$reg >reg.csv
0
Naveen Sharma

これはうまくいきました。ホスト名を解決するためにpingに-aオプションを追加するだけです。ありがとう https://stackoverflow.com/users/4447323/wombat

@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 -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%
)
0
mkemp

Eitan-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
Wombat

@エコーオフ

set workdir = {あなたの作業ディレクトリ。たとえば-C:\ work} set 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
Marcuscus

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

このようにしてください

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

このようにして、常によく行われたping結果に含まれる典型的な文字列ttlを探し、pingを刺激する代わりに、このfindstrでエラーをチェックします

全体的には次のようになります。

@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
peet

これはスペイン語の操作システムで機能します。

スクリプトは2つのパラメーターを受け入れます。

  • iPまたはドメインのリストを含むファイル
  • 出力ファイル

script.bat listofurls.txt output.txt

@echo off
setlocal enabledelayedexpansion
set OUTPUT_FILE=%2
>nul copy nul %OUTPUT_FILE%
for /f %%i in (%1) do (
    set SERVER_ADDRESS=No se pudo resolver el Host
    for /f "tokens=1,2,3,4,5" %%v in ('ping -a -n 1 %%i ^&^& echo SERVER_IS_UP') 
    do (
        if %%v==Haciendo set SERVER_ADDRESS=%%z
        if %%v==Respuesta set SERVER_ADDRESS=%%x
        if %%v==SERVER_IS_UP (set SERVER_STATE=UP) else (set SERVER_STATE=DOWN)
    )
    echo %%i [!SERVER_ADDRESS::=!] is !SERVER_STATE! >>%OUTPUT_FILE%
    echo %%i [!SERVER_ADDRESS::=!] is !SERVER_STATE!
)
0
Pablo Videla