コマンドプロンプトで複数のIPを同時にpingする方法

コマンドプロンプトで複数のIPを同時にpingする方法

ネットワーク管理者やシステムエンジニアにとって、複数のIPアドレスやホスト名に対してpingを実行する作業は日常的に発生します。個別にpingコマンドを入力するのは非効率的であり、特に大規模なネットワークを管理する場合には時間の浪費になります。Windowsのコマンドプロンプトには、複数のIPを同時にpingするための標準的な方法がいくつか用意されています。本記事では、FORループを使用した基本的な手法から、出力結果をフィルタリングする応用テクニック、さらにPowerShellを活用した高度な並列処理までを詳しく解説します。これらの方法を習得することで、ネットワーク診断の効率を大幅に向上させることができます。

FORループを使用した基本的なpingの一括実行

Windowsのコマンドプロンプトで複数のIPアドレスを連続してpingする最も一般的な方法は、FORループを利用することです。このループ構造を使用すると、指定した範囲のIPアドレスに対して自動的にpingコマンドを繰り返し実行できます。基本的な構文は次のとおりです。

FOR /L %i IN (開始値, 増分, 終了値) DO ping -n 1 IPアドレス%i

例えば、192.168.0.1から192.168.0.254までの254個のアドレスをpingする場合、次のコマンドを入力します。

コマンドプロンプトで複数のIPを同時にpingする方法 - 1

FOR /L %i IN (1,1,254) DO ping -n 1 192.168.0.%i

このコマンドは、変数%iに1から254までの数値を順に代入しながら、各IPアドレスに対して1回だけpingを送信します。-n 1オプションは送信するエコー要求の回数を指定しており、ここでは1回に設定しています。デフォルトでは4回送信されるため、大量のIPをチェックする場合にはこのオプションを指定して処理時間を短縮するのが一般的です。ただし、この方法では各pingが順番に実行されるため、254個のアドレスすべてをチェックするにはある程度の時間がかかります。ネットワークの応答速度にもよりますが、通常は数分程度で完了します。

出力結果をフィルタリングして成功応答のみを表示

FORループでpingを実行すると、成功した応答と失敗した応答の両方が画面に表示されます。大量のIPをチェックする場合、成功した応答だけを抽出したいケースがほとんどです。このような場合には、FINDコマンドをパイプで結合して、特定の文字列を含む行だけを表示する方法が有効です。

FOR /L %i IN (1,1,254) DO ping -n 1 192.168.0.%i | FIND /i "Reply"

コマンドプロンプトで複数のIPを同時にpingする方法 - 2

このコマンドでは、各pingの結果から"Reply"という文字列を含む行だけを抽出します。/iオプションは大文字小文字を区別しない検索を指定します。日本語環境のWindowsでは、応答メッセージが"応答"と表示される場合があるため、その場合にはFIND /i "応答"と指定します。さらに、結果をファイルに保存したい場合には、リダイレクト演算子を使用して次のように記述します。

FOR /L %i IN (1,1,254) DO ping -n 1 192.168.0.%i | FIND /i "Reply" >> result.txt

このコマンドを実行すると、成功したping応答だけがresult.txtファイルに追記されます。ファイルを確認することで、応答のあったIPアドレスを一目で把握できます。このテクニックは、ネットワーク上のアクティブなデバイスを特定する際に非常に便利です。

複数IPを同時にpingするためのPowerShellの活用

コマンドプロンプトのFORループは逐次処理であるため、多数のIPをチェックする場合には時間がかかります。より高速に処理するためには、PowerShellの並列処理機能を利用する方法があります。PowerShellでは、Start-Jobコマンドレットを使用して複数のpingインスタンスを同時に実行できます。以下は、複数のIPアドレスに対して同時にpingを実行し、結果を収集するスクリプトの例です。

コマンドプロンプトで複数のIPを同時にpingする方法 - 3

$ips = @("192.168.0.1", "192.168.0.2", "192.168.0.3", "192.168.0.4")
$jobs = @()
foreach ($ip in $ips) {
$jobs += Start-Job -ScriptBlock { param($ip) Test-Connection -ComputerName $ip -Count 1 -Quiet } -ArgumentList $ip
}
$results = $jobs | Wait-Job | Receive-Job
$jobs | Remove-Job

このスクリプトでは、Test-Connectionコマンドレットを使用して各IPに1回のpingを送信し、結果をブール値(TrueまたはFalse)で取得します。-Quietオプションを指定することで、成功した場合にTrue、失敗した場合にFalseを返します。Start-Jobで各pingをバックグラウンドジョブとして実行し、Wait-Jobですべてのジョブが完了するのを待ちます。その後、Receive-Jobで結果を収集します。この方法を使用すると、逐次処理と比較して大幅に処理時間を短縮できます。特に、応答の遅いホストが含まれる場合でも、他のホストの処理がブロックされないという利点があります。

連続pingを複数ホストに対して同時に実行する方法

ネットワークの監視やトラブルシューティングでは、特定のホストに対して継続的にpingを送信し続けたい場合があります。コマンドプロンプトでは、-tオプションを使用して連続pingを実行できますが、複数のホストに対して同時に実行するには工夫が必要です。PowerShellのジョブ機能を使用すると、複数のホストに対して同時に連続pingを実行し、その結果をファイルに記録できます。以下はその例です。

$ips = @("192.168.0.1", "192.168.0.2", "192.168.0.3")
foreach ($ip in $ips) {
Start-Job -ScriptBlock {
param($ip)
while ($true) {
$timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
$result = Test-Connection -ComputerName $ip -Count 1 -Quiet
"$timestamp $ip $result" | Out-File -FilePath "C:\ping_log.txt" -Append
Start-Sleep -Seconds 1
}
} -ArgumentList $ip
}

コマンドプロンプトで複数のIPを同時にpingする方法 - 4

このスクリプトを実行すると、指定したIPアドレスに対して1秒間隔でpingを送信し続け、タイムスタンプと結果をログファイルに追記します。各ジョブは独立して動作するため、一つのホストが応答しなくなっても他のホストの監視は継続されます。ジョブを停止するには、Get-Job | Stop-Jobコマンドを実行します。この方法は、ネットワークの安定性を長期間監視する必要がある場合に特に有効です。

Linux環境におけるfpingコマンドの活用

Windows環境とは異なり、LinuxやUnix系のOSでは標準のpingコマンドに複数ホストを同時にpingする機能はありません。しかし、fpingというオープンソースツールを使用することで、この制限を克服できます。fpingは、複数のホストに対して同時にICMPエコー要求を送信し、応答を効率的に収集するように設計されています。基本的な使用法は次のとおりです。

fping -g 192.168.0.0/24

このコマンドは、192.168.0.0/24のサブネット内のすべてのIPアドレスに対してpingを送信します。-gオプションはIP範囲を指定するためのもので、CIDR表記または開始IPと終了IPを指定できます。また、特定のホスト名やIPアドレスを列挙して実行することも可能です。

コマンドプロンプトで複数のIPを同時にpingする方法 - 5

fping host1 host2 host3

fpingの大きな利点は、応答の速いホストから順に結果が表示される点です。標準のpingでは各ホストの応答を順番に待つ必要がありますが、fpingはすべてのホストに同時にパケットを送信するため、ネットワーク全体の応答状況を短時間で把握できます。さらに、-aオプションを使用すると応答のあったホストだけを表示し、-uオプションでは応答のなかったホストだけを表示できます。これらの機能は、ネットワーク上の障害箇所を特定する際に非常に役立ちます。

実践的な使用例と注意点

複数のIPを同時にpingするテクニックは、さまざまなシナリオで活用できます。例えば、新しいネットワーク機器を導入した際に、その機器が正しく設定されているか確認するために、周辺の全デバイスに対して一斉にpingを送信することができます。また、定期的なネットワーク監視の一環として、特定のサブネット内の全ホストの応答状況をチェックする場合にも有効です。以下に、よく使用されるコマンドの一覧を示します。

  • FOR /L %i IN (1,1,254) DO ping -n 1 192.168.0.%i | FIND /i "Reply"
  • fping -g 192.168.0.0/24 -a 2>nul
  • PowerShell: Test-Connection -ComputerName (1..254 | % {"192.168.0.$_"}) -Count 1 -AsJob | Wait-Job | Receive-Job
  • fping -f hostlist.txt (hostlist.txtにIPアドレスを1行ずつ記述)

これらのコマンドを使用する際には、いくつかの注意点があります。まず、大量のpingを短時間に送信すると、ネットワークに負荷がかかる可能性があります。特に、ブロードキャストドメインが広い環境や、応答の遅いデバイスが多いネットワークでは注意が必要です。また、セキュリティ上の理由から、一部のネットワークではICMPパケットがブロックされている場合があります。その場合、pingが成功しなくても必ずしもホストがダウンしているとは限らないことを理解しておく必要があります。さらに、企業ネットワークや公共のネットワークでこれらのコマンドを実行する際には、事前に管理者の許可を得ることが推奨されます。

トラブルシューティングと効率化のためのヒント

複数IPへのping実行中に問題が発生した場合の対処方法をいくつか紹介します。まず、FORループが正しく動作しない場合、コマンドプロンプトの設定で拡張機能が有効になっているか確認してください。特に、/Lオプションはコマンド拡張機能に依存しているため、無効になっているとエラーが発生します。また、IPアドレスの範囲指定が正しいかどうかも確認が必要です。サブネットマスクを誤って解釈すると、意図しないアドレスにpingを送信する可能性があります。次に、PowerShellのジョブを使用する場合、大量のジョブを同時に実行するとシステムリソースを消費します。目安として、同時に実行するジョブの数は50程度に抑えることを推奨します。それ以上のホストをチェックする必要がある場合には、複数のバッチに分割して実行すると安定します。さらに、fpingを使用する際には、root権限が必要な場合があることに注意してください。多くのLinuxディストリビューションでは、fpingの実行に特権が必要です。sudoコマンドを使用して実行するか、適切な権限を設定してください。

参考資料

本記事で紹介したコマンドやテクニックの詳細については、以下の資料を参照してください。Microsoft LearnのWindowsコマンドリファレンスでは、pingコマンドやFORループの公式ドキュメントが提供されています。また、SuperUserのコミュニティフォーラムでは、実際のユーザーが直面する問題とその解決策が多数共有されています。fpingの詳細については、Wel. R. Bragaのブログ記事が参考になります。PowerShellを使用した並列処理の方法については、RedditのPowerShellコミュニティで活発な議論が行われています。

Microsoft Learn: Windowsコマンドリファレンス - ping
SuperUser: How can I ping a range of IP addresses simultaneously?
Wel. R. Braga: fping - um ping para múltiplos hosts
Reddit: How to do continuous ping to multiple IPs and log results?

コマンドプロンプト ping 複数IP Windows ネットワーク バッチファイル 通信確認
注意 環境や権限により結果は異なる場合があります。
著者

Stefano Barcellos

Visite Barbados の寄稿者。

« 前の投稿
クリップボードを開く方法|コピー履歴の確認手順

関連する投稿