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

「カウントダウン後,定期的に動くタイマー」をBATだけで作る方法 (リアルタイムで残り秒数を表示し,処理を定期実行)

コマンドプロンプト



BATファイルで,「定期的に動くタイマー」を手軽に作る。

時間を置いた繰り返し処理を自動化できる。

タイマーでカウントダウン中の残り秒数も,リアルタイムに表示される。


例として,5分おきにWiFiに再接続してみよう。

下記のバッチファイルを「管理者権限で実行」すればよい。

@echo off
rem カウントダウンして定期的にタイマー処理するバッチ


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


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


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

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 無線LANをOFFにする(※バッチを管理者として実行すること)
netsh int set int "ワイヤレス ネットワーク接続" disable

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


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

すごく手軽に実現できるタイマーだ。


このバッチの実装上のテクニックとしては…

  • 環境変数の算術演算 (SET /a でカウンタを引き算)
  • 環境変数の遅延展開 (!〜〜!でカウンタ変数を変化させながらecho表示)
  • Windowsのバージョンに関わりなくsleepできるように,pingを使用
  • ネットワークアダプタの再起動に当たり,devcon.exeを使わなくてもデバイスのON/OFF切り替えができるように,netshコマンドを代わりに使用
  • 残り秒数が変化してゆくように見せかけるために,clsで画面内用を毎回削除

といったところ。


なお,上記のタイマーの仕組みを,実用的に応用したのが下記のバッチ。

ネットワーク接続が切れたら,自動的に再接続してくれるバッチ (WiFiの電波が弱くても,自動で無線LANにつなぎなおす)
http://language-and-engineering.hatenablog.jp/entry/20140918/BATWifiNetworkCo...


構文の参考:

Windows のバッチファイルでループ回数をカウントアップする (遅延環境変数) : もやもやプログラミング
http://blog.livedoor.jp/moya_pro/arch...

  • set local するときに enabledelayedexpansion と宣言し、カウントアップしたい変数を ! で囲みます。


遅延展開される CMD バッチスクリプトで ! を記述する方法 - is BUG Ready ?
http://d.hatena.ne.jp/ladybug/2009053...

  • 遅延展開は、% のかわりに ! で囲まれた環境変数名を、実行単位で評価してくれる。


DOSバッチファイルでの計算方法
http://www.ylw.mmtr.or.jp/~jkondou/pr...

  • /aのオプション指定をすれば、変数の計算ができる。

関連する記事:

BATのforループで,「0埋めされた数値」を連番で出力しよう (環境変数の遅延展開と,数値の大小比較判定の方法)
http://language-and-engineering.hatenablog.jp/entry/20131116/BATLoopNumberInc...


開発用のフォルダ構成を,自動的に生成してくれるバッチ (プロジェクト用のリポジトリ立ち上げに便利。ついでに,用が済んだら自動消滅!)
http://language-and-engineering.hatenablog.jp/entry/20120126/p1


繰り返し実行可能なコンパイルバッチ
http://language-and-engineering.hatenablog.jp/entry/20081208/1228708657


開発に役立つ,BATファイルの書き方・パターン集 (コマンドプロンプトの定石を体系的に学び,バッチ中級者になろう)
http://language-and-engineering.hatenablog.jp/entry/20130502/PatternsOfMSDOSo...