読者です 読者をやめる 読者になる 読者になる
スポンサーリンク

ネットワーク接続が切れたら,自動的に再接続してくれるバッチ (WiFiの電波が弱くても,自動で無線LANにつなぎなおす)

コマンドプロンプト ネットワーク


Windowsで無線LANを使っていて,電波が弱く,接続が途切れる。

しかも,自動的に接続が復旧せず,「制限つきアクセス」を手動で解除しなければならない。面倒だ。


そんなとき,自動的にネットに再接続してくれるツールがあったら便利だ。

何もしなくても,ネットが切れたら再びつないでくれる


そんなバッチを,BATファイルとして作ってみた。

下記のバッチを「管理者権限で実行」して,ただ放置すればよい。

@echo off
rem
rem 無線LANが落ちていたら,自動的に再接続するバッチ
rem

rem 残り秒数をそのつど変化させて表示するために,変数の遅延展開が必要
setlocal enabledelayedexpansion


rem 処理が終わったらここに戻ってくる
:START


rem 何秒間待機するか
SET COUNTDOWN_MAX=10

rem 変数の遅延展開のために,事前に宣言だけしておく
SET COUNT_NOKORI=0

rem カウントダウンする
rem 指定回数だけ繰り返す
for /L %%i in ( 0, 1, %COUNTDOWN_MAX% ) do ( 

  rem 残り秒数を引き算で計算しなおす
  SET /a COUNT_NOKORI=%COUNTDOWN_MAX%-%%i

  rem 残り秒数を表示 ※遅延展開のために!で囲んでいる点に注意
  cls
  echo ネットワーク接続の定期検査まで残り !COUNT_NOKORI! rem 1秒スリープ(XP以下でも通用する,pingを使った方法)
  ping 127.0.0.1 -n 2 > nul

)


rem 時間が来たら実行する処理


rem ネットワーク接続が利用できなくなっているか?
rem ネットワーク接続コマンドの実行結果が,制限つきアクセスになっているかどうか。


rem コマンドの出力結果を調べて,ネットワークのダウンを表す文字列が含まれているかを検査
echo ネットワーク接続を検査中・・・
SET network_down_flag=0
for /f "usebackq tokens=*" %%a in (`ping google.com`) do (

  rem 文字列に対してfindコマンドを実行し,実行結果のエラーレベルを調べる
  echo %%a | find "見つかりませんでした" >NUL
  if not ERRORLEVEL 1 (
    SET network_down_flag=1
  )
  echo %%a | find "要求がタイムアウトしました" >NUL
  if not ERRORLEVEL 1 (
    SET network_down_flag=1
  )
  
  rem デバッグ用に変数を表示
  rem echo !network_down_flag!
)

if "!network_down_flag!"=="1" (
  rem 無線LANをOFFにする(※バッチを管理者として実行すること)
  netsh int set int "ワイヤレス ネットワーク接続" disable

  rem 無線LANをONにする
  netsh int set int "ワイヤレス ネットワーク接続" enable

  echo ワイヤレスネットワークアダプタが動作していなかったため,再起動しました。
  ping 127.0.0.1 -n 20 > nul

) else (

  echo ワイヤレスネットワークアダプタは正常に動作しています。
  ping 127.0.0.1 -n 5 > nul
)


rem バッチの最初に戻る
goto START

このバッチで利用しているテクニックは…

  • pingの実行結果をforコマンドで文字列に格納し,findコマンドでマッチをかけてifで判定する

という技法を使っている。

コマンドプロンプトでコマンドの実行結果を直接変数に代入する方法 - 半熟メモ
http://hanjyuku.info/mt/memo/2011/04/...

  • コマンドの実行結果を直接変数に代入する方法


batである文字列内に特定の文字列が含まれているか確認したい - その他(プログラミング) - 教えて!goo
http://oshiete.goo.ne.jp/qa/5704741.html

  • ある変数「abc」の中に「test」という文字が含まれていたら○○を行なうという分岐


バッチファイルで、for文の中のsetがうまく動作しない。初心者のため、...
http://detail.chiebukuro.yahoo.co.jp/...

  • for〜を実行する段階で、5行目の閉じカッコまでの変数が展開されます。

「ある一定間隔だけ待機してから,同じ処理を繰り返す」という

処理の骨組みになる部分(タイマー処理)は,下記のエントリーのコードを土台にした。

「カウントダウン後,定期的に動くタイマー」をBATだけで作る方法 (リアルタイムで残り秒数を表示し,処理を実行)
http://language-and-engineering.hatenablog.jp/entry/20140918/BATCountDownTimer

まあ,こんなバッチを作らなくても,

普通はWiFiのドライバが自動的に接続を復旧してくれるんだけど,

そうもいかないケースが実際にあるので。

関連する記事:

bat中でforループをネストし,サブルーチンを呼び出して,条件付きファイル検索の結果を一斉コピーしよう (ファイル名の重複防止機能付き)
http://language-and-engineering.hatenablog.jp/entry/20111030/p1


IE8で,ファイルのアップロードを自動化する方法  (WSH/JScriptでブラウザを自動操作するサンプルコード)
http://language-and-engineering.hatenablog.jp/entry/20100909/p1


バッチで,Word文書の内容を読み取ろう (WSH/JScriptでWordファイルを操作する方法)
http://language-and-engineering.hatenablog.jp/entry/20101105/p1


バッチで,レジストリの値の読み取り・書き込み・存在判定をしよう(WSH/JScriptでレジストリ操作のサンプルコード)
http://language-and-engineering.hatenablog.jp/entry/20100908/p1