したがって、私はバッチのみを使用する必要があります。基本的に、サーバーの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です。
まあ、残念なことに、自分でコードを投稿しなかったので、修正できました。
とにかく、これは私自身のこれに対する解決策です:
@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つの可能なケースを処理します。
ホストIPアドレスを解決できない場合、アドレスは「ADDRESS N/A」に設定されます。
お役に立てれば。
名前と結果が別の行にあるため、バッチを使用してホスト名と結果ごとにpingtest.txtを解析することは困難です。
ファイルにリダイレクトする代わりに、各PINGコマンドの結果(返されたエラーコード)を直接テストする方がはるかに簡単です。また、構造全体を括弧で囲み、最終出力を一度だけリダイレクトする方が効率的です。
>result.txt (
for /f %%i in (testservers.txt) do ping -n 1 %%i >nul && echo %%i UP||echo %%i DOWN
)
これを試して
$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
これはうまくいきました。ホスト名を解決するために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%
)
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%
)
@エコーオフ
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%
)
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%
これはスペイン語の操作システムで機能します。
スクリプトは2つのパラメーターを受け入れます。
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!
)