n-Archives.net

現在の実行がシャットダウンか再起動かを判別する方法

目次

シャットダウンスクリプトは再起動時にも実行されてしまう

以前の記事「バックアップスクリプトを自動で実行する」で、シャットダウン時に自動的にスクリプトを実行させる方法を書きました。

これはとても便利なのですが、このように登録したスクリプトは、「シャットダウン」時だけでなく、「再起動」時にも実行されてしまいます。スクリプトの処理が短時間で済むなら問題ないのですが、スクリプトの処理が長時間のバックアップを行うような処理だと、再起動したいだけにもかかわらず、長い時間待たされることになります。

この問題を回避するため、現在のスクリプトの実行がシャットダウンによるものか再起動によるものかを判定する方法について調べましたので、以下まとめます。

 

バッチファイルでのシャットダウンと再起動の判別方法

シャットダウンスクリプトにおいて、再起動の場合はスクリプトの実行を行わないようにする為には、スクリプトの冒頭に以下のようにコマンドを記載します。

powershell -command "if( Get-EventLog -LogName System | Where-Object {$_.EventID -eq 1074}| Select-Object -First 1 | Where-Object {$_.Message -like '*再起動*'} ) {exit 0} else {exit 1}"
if %errorlevel% == 0 exit /b

<処理スクリプト>
<処理スクリプト>
:

1行目の powershell のコマンドで何をやっているかというと、「システムイベントの直近のシャットダウンイベント(1074)に”再起動"という文字が含まれているかを調べています。"再起動"が含まれていたら、終了コード0でpowershellを終了。含まれていなければ終了コード1でpowershellを終了します。

次の if 文では、直前に実行した powershell の終了コードが 0 である場合(再起動の場合)は exit /b でバッチファイルの実行を終了します。その結果、本来の <処理スクリプト> はスキップされて実行されないことになります。

 ここで、exit に /bオプションを付けることに注意してください。 /bオプションを付けないと、バッチファイルだけでなく、バッチファイルを実行していた cmdプロセスごと終了してしまいます。シャットダウンスクリプトとして登録されたスクリプトを /bオプション無しで exit してしまうと、Windowsの終了処理を進めていた cmd を異常な形で終了させてしまうため、次回起動時に、正常にWindowsが起動しなくなったりしますので、ご注意ください。

 

なお、余談ですが、バッチファイルの制御文の記述には十分ご注意ください。if文の行については、"==" の前後に空白文字を入れるのを忘れないようにしてください。

 

手動でも実行したい

上記方法では直近のシャットダウンイベントが、「シャットダウン」か「再起動」かを判別します。ですので、スクリプトを手動で実行する場合、「前回の」シャットダウンイベントを調べてしまいます。前回がたまたま「再起動」だった場合であれば、手動でスクリプトを実行しても実行されずに終了してしまいます。

これを回避する方法として、上記判定ロジックに「直近のシャットダウンイベントが現在から60秒以内であるか」という判定ロジックを組み込む方法があります。

 

powershell -command "if( Get-EventLog -LogName System | Where-Object {$_.EventID -eq 1074}| Select-Object -First 1 | Where-Object {$_.TimeGenerated -gt (Get-Date).Addseconds(-60)} | Where-Object {$_.Message -like '*再起動*'} ) {exit 0} else {exit 1}"
if %errorlevel% == 0 exit /b

<処理スクリプト>
<処理スクリプト>
:

TimeGenerated という属性を調べることでイベントの発生時刻が分かりますので、それで判断します。

これにより、再起動してから60秒以降であれば、手動でスクリプトを実行しても、処理を実行させることができます。60秒という秒数は適当に設定しているので、必要があれば、適切な値に修正してください。

 

RoboSyncでの設定方法

上記の設定を RoboSyncで設定する場合、スクリプト編集画面から、「開始時のスクリプト」欄に、上記のスクリプトを記載すればよいです。

 

 

 



Related Articles

 

コメントをお送りください
お名前:
コメント:
コメントの公開:



管理者より個人的に返信をご希望の方は、コメント中に必ずメールアドレスを記載してください。記載がないと返信できませんのでご注意ください。

If you want personal response from the author, please do not forget to write your email address in the comment. Otherwise, the author can not reply.

投稿されたコメントは手動で処理されるため、記事として登録されるまで1日程度かかります。

Submitted comments will be processed manually. So, please understand it will take about a day to publish your comment.