るつぼっと

NWエンジニアな人たちに向けて

[Windows] 複数宛先へのPing,Traceroute結果を自動保存するバッチ

はじめに

端末からの疎通確認と結果保存を自動化するバッチ。
特徴は下記のとおりです。結局ExPingを使うのがいいかもしれない。

  • 複数の宛先へPing,Tracerouteを同時に実行する
  • ログを自動的にファイルへ保存する
  • かつ、プロンプト上にも結果を出力する

概要

ファイル構成は下記のとおりです。

  • 親バッチファイル:疎通先IPを定義する。子バッチファイルを呼び出す役割も持つ。
  • 子バッチファイル:疎通確認コマンドを実行し、結果を出力する。

使い方は下記のとおりです。

  1. 両バッチファイルを同じフォルダへ配置する
  2. 親バッチファイル内に疎通先IPを定義する
  3. 親バッチファイルを実行する

中身の説明

実際のバッチファイルです。
コピペで使えますが、remの行は文字化けすると思うので消してください。

親バッチファイル

@echo off

rem バッチファイルのある場所をカレントディレクトリにする
cd /d %~dp0

rem 括弧内に疎通先IPを半角スペース区切りで定義する。
rem IPは変数%%fに格納され、それをChild.batの引数として使用している。
rem f以外に変えてもOKだが2文字以上の名称にはできないようなので注意。
for %%f in (192.168.1.1 192.168.1.2) do (
start Child.bat %%f
)

子バッチファイル

@echo off

rem 実行コマンド関連の変数を定義。コマンドオプションは適宜チューニング
rem %1にはParent.batから渡されたIPが入っている
set DstIP=%1
set PingCommand=ping %DstIP% -w 1
set TracertCommand=tracert -d -w 1000 %DstIP%

rem ログファイル名の変数を定義。
rem 1行目は日付を取得しスラッシュを空へ置換(=削除)
rem 2行目は時刻を取得し空白を0へ置換 9:00:00.00 → 09:00:00.00
rem これをやらないと一桁台の時刻でバッチにエラーが起きる
rem 3行目は上記結果から時,分,秒を切り出し 09:00:00.00→090000
set RunDate=%date:/=%
SET tmp=%time: =0%
SET RunTime=%tmp:~0,2%%tmp:~3,2%%tmp:~6,2%
set Filename= result_%RunDate%_%RunTime%_%DstIP%.txt

rem コマンドを実行しファイルへ追記出力
rem 実行結果しか出力されないためどんなコマンドを打ったか証跡が残らない
rem そこで重要なコマンドについてはechoを実行して別途出力している
rem echo. はただの空行。ログを見やすくするために入れている
hostname              >> %Filename%
ipconfig              >> %Filename%
echo.                 >> %Filename%
echo %PingCommand%    >> %Filename%
%PingCommand%         >> %Filename%
echo.                 >> %Filename%
echo %TracertCommand% >> %Filename%
%TracertCommand%      >> %Filename%

rem ファイルの内容を出力
rem 注意点として、全コマンド完了後に纏めて表示する挙動となる
rem よって疎通NG時はTimeout待ちでなかなか表示されず不安になる
type %Filename%

rem ログの目視確認のため、キーを押すまでウィンドウを閉じないようにする
pause
exit

使用感

両ファイルを配置。
f:id:yoloz:20220226215200p:plain

Parent.batを実行。
f:id:yoloz:20220226215240p:plain

実行結果を確認できる。
ログファイルの掲載は割愛。実際に試してみてください。
f:id:yoloz:20220226215300p:plain

別解

実行コマンドを宛先毎に変えたい場合は下記のようにする。
宛先IP分だけ子バッチファイルを作成する必要がある。

親バッチファイル

@echo off

cd /d %~dp0

rem 同一フォルダにあるchild*.batを全て実行する
for %%f in (Child*.bat) do (
start %%f
)

子バッチファイル

Child1.bat

@echo off

rem DestIPを直接入力
set DstIP=192.168.1.1
set PingCommand=ping %DstIP% -w 1
set TracertCommand=tracert -d -w 1000 %DstIP%
(以下略)

同様に、宛先IP分Child*.batを作る

所感

昔作ったやつを記憶を頼りに再現・ブラッシュアップしてみた。
ExPing以外にも今はWSLやPowerShell等のより高等なものがあるので実用性は微妙だが、
思い出として残しておく。