【bat】バッチファイルでネットワーク接続を継続監視して自動復旧する完全ガイド|ping多点確認・netsh再接続・Wi-Fi・ドライブ再マウント・ログ記録まで

【bat】バッチファイルでネットワーク接続を継続監視して自動復旧する完全ガイド|ping多点確認・netsh再接続・Wi-Fi・ドライブ再マウント・ログ記録まで bat

テレワーク環境や無線LANが不安定な環境では、気づかないうちにネットワーク接続が切れて作業が止まることがあります。バッチファイルで定期的に接続を確認→異常検知→自動復旧するループを実装すれば、人手なしでネットワーク障害に対処できます。

本記事では ping による単点・多点チェック・誤検知対策・netsh によるアダプター再起動(イーサネット/Wi-Fi 両対応)・ネットワークドライブの自動再マウント・ログ記録まで体系的に解説します。

この記事でわかること

  • ping で接続状態を定期確認する監視ループの基本
  • 複数ターゲットへの ping で誤検知(サーバー側の問題)を排除する方法
  • netsh でイーサネット・Wi-Fi アダプターを再起動して自動復旧する方法
  • 再接続後に疎通確認してから処理を再開する確認ループ
  • 切断時に net use でネットワークドライブを自動再マウントする方法
  • 監視ログ・再接続履歴を日付別ファイルに記録する方法
スポンサーリンク

ネットワーク監視・復旧方法の比較

方法 接続確認精度 誤検知対策 復旧操作 権限
ping 単発 △(パケットロスで誤検知) 不要
ping 多点確認 ○(複数に失敗したら異常) 不要
netsh adapter 再起動 ○(アダプター再起動) 管理者必須
net use 再マウント ○(ドライブ再接続) 不要(認証次第)
PowerShell Restart-NetAdapter ○(アダプター名で指定) 管理者必須
ping 単発チェックの誤検知問題
送信先サーバー(8.8.8.8 など)が一時的に応答しない場合や、パケットロスが1回あるだけで異常と判断してしまいます。「複数の異なるターゲットへの ping が両方失敗したとき」を条件にすることで、自分側の接続問題に限定して誤検知を大幅に減らせます。

基本:ping 監視ループでネットワーク接続を定期確認する

基本: 60秒ごとに ping チェック + タイムスタンプ付きログ
@echo off
setlocal

set TARGET=8.8.8.8
set LOGFILE=C:\logs\net_monitor.log
set INTERVAL=60
if not exist "C:\logs" mkdir "C:\logs"

call :log "===== 監視開始 ターゲット: %TARGET% ====="

:LOOP
REM ping -n 3: 3回送信して1回でも "TTL=" が返れば接続OK
ping -n 3 %TARGET% | findstr "TTL=" >nul 2>&1
if %ERRORLEVEL% equ 0 (
    call :log "[OK] %TARGET% 疎通確認"
) else (
    call :log "[NG] %TARGET% 応答なし"
)
timeout /t %INTERVAL% /nobreak >nul
goto LOOP

:log
set T=%TIME: =0%
echo [%DATE% %T:~0,8%] %~1 >> "%LOGFILE%"
echo [%DATE% %T:~0,8%] %~1
goto :eof
findstr “TTL=” vs find “TTL=” の違い
findstr "TTL=" は正規表現対応で大文字小文字を区別します。find "TTL=" は固定文字列検索でシンプルです。どちらでも動作しますが、findstr/i オプションで大文字小文字を無視できるため環境差異に強いです。

誤検知を減らす:複数ターゲットへの ping 多点確認

Google DNS(8.8.8.8)だけを監視すると、Google側の問題やISPの経路障害で誤検知します。複数の独立したターゲットへの ping が全て失敗したときだけ異常と判断することで、誤検知率を大きく下げられます。

多点確認: 複数ターゲット全滅のとき異常と判断
@echo off
setlocal enabledelayedexpansion

REM 監視ターゲット(独立した複数のサーバーを使う)
set T1=8.8.8.8
set T2=1.1.1.1
set T3=208.67.222.222
set LOGFILE=C:\logs\net_multi.log
set INTERVAL=60
if not exist "C:\logs" mkdir "C:\logs"

:MULTI_LOOP
set FAIL=0

REM 各ターゲットへ ping
for %%T in (%T1% %T2% %T3%) do (
    ping -n 2 %%T | findstr "TTL=" >nul 2>&1
    if !ERRORLEVEL! neq 0 set /a FAIL+=1
)

set T=%TIME: =0%
set TS=%DATE% %T:~0,8%

if %FAIL% geq 2 (
    REM 3件中2件以上失敗 → 接続異常と判断
    echo [%TS%] [NG] ネットワーク異常検知 (失敗 %FAIL%/3) >> "%LOGFILE%"
    call :reconnect
) else if %FAIL% equ 1 (
    echo [%TS%] [WARN] 部分的な到達不能 (失敗 %FAIL%/3) >> "%LOGFILE%"
) else (
    echo [%TS%] [OK] 全ターゲット疎通OK >> "%LOGFILE%"
)

timeout /t %INTERVAL% /nobreak >nul
goto MULTI_LOOP

:reconnect
echo [%TS%] 再接続処理を開始します >> "%LOGFILE%"
goto :eof

:log
set T=%TIME: =0%
echo [%DATE% %T:~0,8%] %~1 >> "%LOGFILE%"
echo [%DATE% %T:~0,8%] %~1
goto :eof

netsh でネットワークアダプターを再起動して復旧する

接続異常を検知したら netsh interface set interface でアダプターを一度無効にしてから有効にします。管理者権限が必要です。

netsh でアダプターを再起動する :reconnect サブルーチン
@echo off
setlocal

REM アダプター名確認: netsh interface show interface で一覧表示
REM よくある名前: "イーサネット" "Wi-Fi" "ローカル エリア接続"
set ADAPTER=イーサネット

call :reconnect_adapter
goto :eof

:reconnect_adapter
set T=%TIME: =0%
echo [%DATE% %T:~0,8%] [INFO] %ADAPTER% を再起動します

REM アダプターを無効化
netsh interface set interface "%ADAPTER%" admin=disable
if %ERRORLEVEL% neq 0 (
    echo [ERROR] アダプター無効化失敗 管理者権限で実行してください
    exit /b 1
)
timeout /t 5 /nobreak >nul

REM アダプターを有効化
netsh interface set interface "%ADAPTER%" admin=enable
timeout /t 10 /nobreak >nul

echo [%DATE% %T:~0,8%] [INFO] %ADAPTER% 再起動完了
goto :eof
アダプター名を自動取得して再起動する(netsh show interface)
@echo off
setlocal enabledelayedexpansion

REM 接続済みアダプター名を一覧表示
echo === 接続済みアダプター一覧 ===
netsh interface show interface | findstr "接続済み"
echo.

REM 接続済みの最初のアダプター名を取得
set ADAPTER=
for /f "tokens=4*" %%A in ('netsh interface show interface ^| findstr "接続済み"') do (
    if not defined ADAPTER set ADAPTER=%%A %%B
)
REM 末尾の余分なスペースを除去
for /f "tokens=* delims= " %%A in ("%ADAPTER%") do set ADAPTER=%%A

echo 対象アダプター: [%ADAPTER%]

netsh interface set interface "%ADAPTER%" admin=disable
timeout /t 5 /nobreak >nul
netsh interface set interface "%ADAPTER%" admin=enable
echo 再起動完了: %ADAPTER%
netsh によるアダプター操作は管理者権限が必須
netsh interface set interface ... admin=disable を実行するには管理者として実行する必要があります。タスクスケジューラに登録する場合は「最上位の特権で実行する」にチェックを入れてください。アダプター名は netsh interface show interface で確認できます。日本語環境では「イーサネット」「Wi-Fi」、英語環境では「Ethernet」「Wi-Fi」が一般的です。

Wi-Fi アダプターの再接続と SSID 再接続

Wi-Fi 接続が切れた場合、アダプター再起動だけでは SSID に再接続されないことがあります。netsh wlan connect で明示的に SSID を指定して再接続します。

Wi-Fi アダプター再起動 + SSID への再接続
@echo off
setlocal

set WIFI_ADAPTER=Wi-Fi
set SSID=MyWiFiNetwork
set LOGFILE=C:\logs\wifi_monitor.log
if not exist "C:\logs" mkdir "C:\logs"

:WIFI_LOOP
ping -n 3 8.8.8.8 | findstr "TTL=" >nul 2>&1
if %ERRORLEVEL% equ 0 goto WIFI_OK

REM --- Wi-Fi 異常検知 ---
set T=%TIME: =0%
echo [%DATE% %T:~0,8%] [NG] Wi-Fi 切断検知 >> "%LOGFILE%"

REM アダプター再起動
netsh interface set interface "%WIFI_ADAPTER%" admin=disable
timeout /t 5 /nobreak >nul
netsh interface set interface "%WIFI_ADAPTER%" admin=enable
timeout /t 10 /nobreak >nul

REM SSID へ再接続
netsh wlan connect name="%SSID%"
echo [%DATE% %T:~0,8%] [INFO] SSID "%SSID%" へ再接続要求 >> "%LOGFILE%"

REM 再接続確認(最大30秒待機)
set WAIT=0
:WIFI_CHECK
timeout /t 5 /nobreak >nul
set /a WAIT+=5
ping -n 1 8.8.8.8 | findstr "TTL=" >nul 2>&1
if %ERRORLEVEL% equ 0 (
    echo [%DATE% %T:~0,8%] [OK] Wi-Fi 復旧 (待機: %WAIT%秒) >> "%LOGFILE%"
    goto WIFI_OK
)
if %WAIT% lss 30 goto WIFI_CHECK
echo [%DATE% %T:~0,8%] [WARN] Wi-Fi 復旧確認タイムアウト >> "%LOGFILE%"

:WIFI_OK
timeout /t 60 /nobreak >nul
goto WIFI_LOOP

ネットワークドライブを自動再マウントする

ネットワーク接続が復旧しても、切断前に接続していたネットワークドライブが自動的には再マウントされないことがあります。net use で接続状態を確認し、切断されていれば再マウントします。

ネットワークドライブ状態確認 + 自動再マウント
@echo off
setlocal enabledelayedexpansion

REM 監視するドライブ・共有パス・認証情報の設定
set DRIVE=Z:
set UNC=\\server\share
set NET_USER=domain\username
set NET_PASS=password
set LOGFILE=C:\logs\drive_monitor.log
if not exist "C:\logs" mkdir "C:\logs"

:DRIVE_LOOP
REM ドライブの接続状態を確認
net use %DRIVE% >nul 2>&1
if %ERRORLEVEL% equ 0 (
    REM 実際にアクセスできるか確認(キャッシュ済みでも切れている場合がある)
    dir %DRIVE% >nul 2>&1
    if !ERRORLEVEL! equ 0 (
        call :log "[OK] %DRIVE% マウント済み・アクセス可"
        goto DRIVE_WAIT
    )
)

REM --- 切断・アクセス不可 → 再マウント ---
call :log "[NG] %DRIVE% 切断検知 再マウントします"

REM 既存の接続を削除してから再接続
net use %DRIVE% /delete >nul 2>&1
net use %DRIVE% %UNC% /user:%NET_USER% %NET_PASS% /persistent:no

if %ERRORLEVEL% equ 0 (
    call :log "[OK] %DRIVE% 再マウント成功: %UNC%"
) else (
    call :log "[NG] %DRIVE% 再マウント失敗 ERRORLEVEL=%ERRORLEVEL%"
)

:DRIVE_WAIT
timeout /t 120 /nobreak >nul
goto DRIVE_LOOP

:log
set T=%TIME: =0%
echo [%DATE% %T:~0,8%] %~1 >> "%LOGFILE%"
echo [%DATE% %T:~0,8%] %~1
goto :eof
net use でのドライブ確認は dir でも補完する
net use Z: が成功しても、ネットワーク接続が切れた後にキャッシュが残っていると「接続済み」と返ることがあります。dir Z:\ で実際にアクセスを試みることで、真の接続状態を確認できます。ネットワークドライブのマウント全般はネットワークドライブを自動マウントして処理を実行する方法も参照してください。

実践:総合ネットワーク監視・自動復旧バッチ

これまでの手法を組み合わせた実践的な監視バッチです。多点 ping → 異常検知 → アダプター再起動 → 疎通確認 → ドライブ再マウントの全フローをログ付きで実装します。

net_watchdog.bat: 総合ネットワーク監視・自動復旧バッチ
@echo off
setlocal enabledelayedexpansion

REM ===== 設定 =====
set ADAPTER=イーサネット
set DRIVE=Z:
set UNC=\\server\share
set PING1=8.8.8.8
set PING2=1.1.1.1
set INTERVAL=60
set MAX_RECONNECT=5

REM ログファイル(日付付き)
for /f "tokens=2 delims==" %%A in ('wmic os get LocalDateTime /value') do set DT=%%A
set LOGFILE=C:\logs\net_%DT:~0,8%.log
if not exist "C:\logs" mkdir "C:\logs"

set RECONNECT_COUNT=0
call :log "===== ネットワーク監視開始 ====="

:MAIN_LOOP
REM --- 多点 ping チェック ---
set FAIL=0
ping -n 2 %PING1% | findstr "TTL=" >nul 2>&1
if !ERRORLEVEL! neq 0 set /a FAIL+=1
ping -n 2 %PING2% | findstr "TTL=" >nul 2>&1
if !ERRORLEVEL! neq 0 set /a FAIL+=1

if %FAIL% lss 2 (
    call :log "[OK] ネットワーク正常"
    set RECONNECT_COUNT=0
    goto CHECK_DRIVE
)

REM --- 接続異常 ---
set /a RECONNECT_COUNT+=1
call :log "[NG] 接続異常検知 (累計再接続: !RECONNECT_COUNT!/%MAX_RECONNECT%)"

if !RECONNECT_COUNT! gtr %MAX_RECONNECT% (
    call :log "[ABORT] 再接続上限到達 監視を停止します"
    exit /b 1
)

REM --- アダプター再起動 ---
netsh interface set interface "%ADAPTER%" admin=disable
timeout /t 5 /nobreak >nul
netsh interface set interface "%ADAPTER%" admin=enable
call :log "[INFO] アダプター %ADAPTER% 再起動"

REM --- 疎通回復確認(最大60秒)---
set WAIT=0
:RECOVERY_CHECK
timeout /t 5 /nobreak >nul
set /a WAIT+=5
ping -n 1 %PING1% | findstr "TTL=" >nul 2>&1
if %ERRORLEVEL% equ 0 (
    call :log "[OK] 疎通回復確認 (待機: %WAIT%秒)"
    goto CHECK_DRIVE
)
if %WAIT% lss 60 goto RECOVERY_CHECK
call :log "[WARN] 疎通回復確認タイムアウト"

:CHECK_DRIVE
REM --- ドライブ確認・再マウント ---
dir %DRIVE% >nul 2>&1
if %ERRORLEVEL% neq 0 (
    net use %DRIVE% /delete >nul 2>&1
    net use %DRIVE% %UNC% /persistent:no
    if !ERRORLEVEL! equ 0 (
        call :log "[OK] %DRIVE% 再マウント成功"
    ) else (
        call :log "[NG] %DRIVE% 再マウント失敗"
    )
)

timeout /t %INTERVAL% /nobreak >nul
goto MAIN_LOOP

:log
set T=%TIME: =0%
echo [%DATE% %T:~0,8%] %~1 >> "%LOGFILE%"
echo [%DATE% %T:~0,8%] %~1
goto :eof
関連記事
ネットワーク接続の有無だけを確認して処理を分岐するパターンはネットワーク接続の有無を判定して処理を分岐する方法、共有フォルダへの接続エラーと自動リカバリは共有フォルダへの接続エラーを検出して自動リカバリする方法、プロセスの監視・自動復旧はプロセスを監視して異常終了を検知する完全ガイドを参照してください。

まとめ

  • 基本監視: ping -n 3 8.8.8.8 | findstr "TTL=" で接続確認し、失敗でログ記録
  • 誤検知対策: 複数ターゲット(8.8.8.8・1.1.1.1 など)への ping が2件以上失敗したら異常と判断
  • アダプター再起動: netsh interface set interface "名前" admin=disable/enable(管理者権限必須)
  • Wi-Fi 再接続: アダプター再起動後に netsh wlan connect name="SSID" で SSID を明示指定
  • 疎通確認ループ: 再起動後に最大N秒待機しながら ping で回復を確認
  • ドライブ再マウント: dir Z:\ >nul 2>&1 → 失敗なら net use で再マウント
  • 再接続上限: MAX_RECONNECT を設定して無限ループを防止

関連記事: ネットワーク接続の有無を判定して処理を分岐する方法 / ネットワークドライブを自動マウントして処理を実行する方法 / IPアドレスを取得してログに記録する完全ガイド

よくある質問(FAQ)

Qnetsh でアダプターを無効化すると「アクセスが拒否されました」と表示されます。
Anetsh によるネットワークアダプターの操作には管理者権限が必要です。バッチファイルを右クリック→「管理者として実行」で実行してください。タスクスケジューラに登録する場合は「最上位の特権で実行する(最高レベルの特権で実行)」にチェックを入れます。
Qアダプター名が「イーサネット」「Wi-Fi」ではなく別の名前です。どう確認しますか?
Anetsh interface show interface を実行するとアダプター名の一覧が表示されます。「接続済み」の行の右端に表示される名前が正確なアダプター名です。スペースを含む名前はダブルクォートで囲む必要があります(例: "ローカル エリア接続")。
QVPN 接続中に監視バッチを動かすと誤検知します。
AVPN 接続中はデフォルトルートが変わり、8.8.8.8 への ping が VPN 経由になって遅延・失敗することがあります。VPN 環境では ping のターゲットを社内ゲートウェイや VPN サーバーの IP に変更してください。また ping -n 3(3回試行)にして単発パケットロスでの誤検知を減らすことも有効です。
Q監視ループが止まってしまいます。常駐させ続けるにはどうすればいいですか?
Aバッチファイルのウィンドウを閉じると監視が止まります。タスクスケジューラに「PC起動時」または「ログオン時」トリガーで登録し、「ユーザーがログオンしているかどうかにかかわらず実行する」に設定すると常駐できます。または start /min "" monitor.bat で最小化して起動する方法もあります。
Q再接続後もネットワークドライブが Z: として表示されますが中身にアクセスできません。
Aネットワークが切れた状態で接続が「キャッシュ済み」として残ることがあります。net use Z: /delete で一度削除してから net use Z: \\server\share で再接続してください。dir Z:\ >nul 2>&1 のようにアクセスを試みて ERRORLEVEL で判断することで、キャッシュ状態でも正確に接続可否を判定できます。