6

だから私はこれだけにバッチを使わなければなりません。基本的に、サーバーのホスト名はすべてtxtファイルにリストされています。次のコードを使用して、すべてのサーバーにpingを実行し、その結果をtxtファイルに表示しました。

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

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

ヘルプをいただければ幸いです。:)

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

4

8 に答える 8

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

お役に立てれば。

于 2012-09-13T17:34:24.517 に答える
4

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

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

>result.txt (
  for /f %%i in (testservers.txt) do ping -n 1 %%i >nul && echo %%i UP||echo %%i DOWN
)
于 2012-09-13T16:20:41.447 に答える
0

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%
于 2013-03-14T19:34:29.283 に答える
0

これを試して

$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
于 2014-02-27T22:37:22.107 に答える
0

以前に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%
    )
于 2015-01-12T23:57:42.010 に答える
0

@エコーオフ

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%
)
于 2016-04-01T18:16:14.947 に答える
0

これはうまくいきました。ホスト名を解決するために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%
)
于 2016-08-12T18:50:27.417 に答える
0

これはスペイン語のオペレーティングシステムで機能します。

スクリプトは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!
)
于 2018-04-19T15:13:50.207 に答える