こんにちは!今回は処理中に再起動を要求されるケースの対応方法の一つとして、再起動後に自動実行されるバッチの作り方をまとめてみました。
再起動を要求される処理は非常に多い
Windowsの初期セットアップやカスタマイズ、脆弱性の対応など、モジュールをインストールする際にバッチを使用する機会はたくさんあります。
ソフトウェアやドライバ、Windows 更新プログラムのインストールなど、実際に適用していくとリブートを要求されるケースはザラにあります。そこで、再起動が必須な状況でも動作するようなバッチを作成してみましょう。
RunOnceレジストリを使う
単純に再起動後に実行させるという要件であればRunOnceレジストリを使用してしまえば事足りるでしょう。
今回はユーザーでログオン後に実行させることを前提にHKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\RunOnceを使用します。
RunOneレジストリについてはこちらを参考にしてください。
https://support.microsoft.com/ja-jp/help/179365/info-run-runonce-runservices-runservicesonce-and-startup
引数を使って再起動判定する
RunOnceレジストリにスクリプト登録時に引数をつけることができます。
そこにジャンプしたいラベルを与えることで、再起動後に必要な処理へ移動させることができます。
バッチの第1引数は、%1に格納されます。(第2引数は%2、第3引数は%3・・・
reg add "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\RunOnce" /v "再起動後実行" /t REG_SZ /d "%~0 AfterReboot1" /f
※%~0は自分自身のフルパスを返す変数
そして判定をバッチの一番最初に記述します。
それによって1つのバッチで処理を段階的に実行させることができます。
配信したりする場合は便利ですね。
if "%1" neq "" goto :%1
こんな感じでいいでしょう。
※IFの条件式にある%1の両端に「"」がないと動作しませんでした。
作成例
さて、上記を踏まえてまとめたコードがこちらになります。
@echo off
cd /d %~dp0
==============================
再起動判定
==============================
if "%1" neq "" goto :%1
"再起動を要求される処理"
reg add "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\RunOnce" /v "再起動後実行" /t REG_SZ /d "%~0 AfterReboot1" /f
exit
==============================
再起動後処理
==============================
:AfterReboot1
"再起動後に行いたい処理"
exit
内容に合わせて処理を書き換えてみてくださいね。
まとめ
- 再起動後実行させるためにはRunOnceレジストリが便利
- %~0と引数を使えば自分自身だけで処理を完結できる
いろんな自動化処理に使えるテクニックなので、是非活用してみてください。
なにかのお役に立てれば幸いです。
コメント