Windows10のプログラムをタスクスケジューラーで自動化

[技術ネタ]タスクスケジューラでプログラムの実行を自動化(Windows10)

展示系のインスタレーションでは、
運用時間に自動的にプログラムが動くようなスタートアップのバッチを書いたりしますが、
OSのバージョン等によって、バッチが起動しない問題があったりするので、
その対策に関するメモです。
(今回の対象は、Windows10 Professionalのタスクスケジューラをつかった運用を想定しています。)

基本的には、下記のサイトのバッチをつかわせていただいていたのですが、
スリープからの復旧と、その際のプログラムが実行されない問題を解消することができませんでした。
http://izmiz.hateblo.jp/entry/2015/02/18/214646

色々調べてみたところ、下記のsuspend.exeでは復旧できたので、こちらに設定を変更しています。
(ちなみに、hibernate.exeだと復旧はできませんでした。)
https://tipszone.jp/20110517_stop-pc/

 

■ 想定環境

・イベント時間: 17:00 ~ 24:00
それ以外は眠らせたい。

・PC

  • Windows10 Professional 64bit
  • アカウントのパスワードは「無し」に

・作成するバッチ
1. イベント用アプリケーションをexitして、眠らせる(goToSleep.bat)
2. 起こして、PC再起動(wakeup.bat)
3. PC起動時にイベント用アプリケーションを立ち上げる(startup.bat)

 

■ 手順

1. バッチ作成
2. タスクマネージャーに各種バッチを登録
3. 電源周りの設定を変更

 

■ バッチ作成

1. イベント用アプリケーションをexitして、眠らせる(goToSleep.bat)

  rem
  rem goToSleep.bat
  rem

  echo "kill all apps and go to Hibernation"

  taskkill /im "eventApp.exe" /f

  timeout /T 10

  cd "C:\bat"
  start suspend.exe

 

2. 起こして、PC再起動(wakeup.bat)

  rem
  rem wakeFromSleepAndReboot.bat
  rem

  echo "wake from sleep and reboot"

  timeout /T 20

  shutdown -r -t 10

 

3. PC起動時にイベント用アプリケーションを立ち上げる(startup.bat)

  rem
  rem launchApps.bat
  rem

  echo "launch apps"

  cd "C:\bat\"
  start eventApp.exe

  exit

 

4. スリープ用のスクリプトファイルをexeに変換(suspend.exe)

  require 'Win32API'

  # http://msdn.microsoft.com/en-us/library/aa373201(v=vs.85).aspx
  setSuspendState = Win32API.new('powrprof.dll', 'SetSuspendState', %w(i i i), 'i')
  setSuspendState.call(0, 0, 0)

※ こちらはexeが下記にあるので、今回はそちらを使ったので実際にコンパイルはしてません。
suspend.exe

 

■ タスクマネージャーに各種バッチを登録

1. 最上位特権で実行にチェックを忘れずに

 

2. トリガーの設定
goToSleep.batの場合は、イベントの終了時間をセット、
wakeup.batの場合は、イベントの開始の10分前くらいにセットします。
startup.batの場合は、「スタートアップ時」ではなく、「任意のユーザーのログオン時」に設定したほうが安定していました(参考画像)。

 

3. 実行するプログラム(goToSleep.bat, wakeup.bat, startup.bat)をセット

 

4. タスクを実行するためにスリープを解除にチェック
これにより、wakeup.batがスリープ中にでも起き上がって実行できるようになります。

 

5. その他の設定

 

その他、詳細はこちらを参照
http://izmiz.hateblo.jp/entry/2015/02/18/214646

 

■ 電源周りの設定を変更

1. 電源とスリープを自動で実行しないように

 

2. 電源オプションの「詳細な電源設定の変更」から、以下を設定

  • ハイブリッドスリープ -> オン
  • スリープ解除タイマーの許可 -> 有効

 

3. ファイヤーウォールを無効に

 

4. 自動的にスリープが解除されるバグ対策
ついでに、win10では自動でスリープ解除される現象があるようで、
調べていくと下記の自動メンテナンスが原因っぽかったので、こちらも停止。
http://diy-ilands.com/2015/08/05/windows-10-sleep-mode/

 

以上です!