Windowsのタスクスケジューラーでプログラムを定期的に実行するノウハウを共有する。
プログラム(program.exe)を毎日特定の時間に起動する。 実行ログをファイル(YYYYMMDD_hhmmss.log)に残す。
- [Win]+[R]を押して「ファイル名を指定して実行」を開き、「eventvwr」を実行する。
- イベントビューアーで[アプリケーションとサービスログ]>[Microsoft]>[Windows]を展開、[TaskScheduler]を選択する。
- [Operational]のプロパティを開き、「ログを有効にする」のチェックを入れる。
- [適用]、[OK]を押して設定を保存したらOSを再起動する。
- 管理者権限でPowerShellを開き、「PowerShell Set-ExecutionPolicy RemoteSigned」を実行する。(1度のみ)
- [Win]+[R]を押して「ファイル名を指定して実行」を開き、「control schedtasks」を実行する。
- タスクスケジューラーの[操作]から「タスクの作成」を押す。
- タスクの設定をしていく。
- [全般]で以下の設定をする。
* 名前 : 任意のタスクの名前(e.g. WakeUpProgram)
* セキュリティオプション- タスク実行時に使うユーザーアカウント : ユーザーアカウントを選択
- 最上位の特権で実行する:チェックを入れる
* 構成 : Widnows 10
- [トリガー]で以下の設定をする。
[新規]を押してトリガーを設定する。
トリガーは「毎日」、開始日時「YYYY/MM/DD」「hh:mm:ss」を設定する。
1日のうち指定した間隔で繰り返し開始するときは[繰り返し間隔]にチェックを入れて設定する。
1日のうち複数の特定の時間に開始するときは複数のトリガーを作成する。 - [操作]で以下の設定をする。
操作は「プログラムの開始」を選択する。
プログラムをPowerShellで起動するように設定する。
* プログラム/スクリプト : %SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe
* 引数の追加 : -Command "<path-to-script>/script.ps1"
* 開始オプション : PowerShellのカレントディレクトリを設定する。パスは""で囲まない。(e.g. C:\) - [条件]で以下の設定をする。
* [タスクを実行するためにスリープを解除する]にチェックを入れる。
- [Win]+[R]を押して「ファイル名を指定して実行」を開き、「netplwiz」を実行する。
- 「ユーザーがこのコンピューターを使うには、ユーザー名とパスワードの入力が必要」のチェックを外す。
- 「設定」を開き、[アカウント]>[サインインオプション]を開く。
- [インインを求める]で「なし」を選択する。
- コントロールパネルを開き、[電源オプション]>[電源ボタンの動作を選択する]を開く。
- 「現在利用可能ではない設定を変更します」を押す。
- 「高速スタートアップを有効にする」のチェックを外す。
ログファイルのファイル名は現在の日時から取得している。 パイプで繋ぐことで標準出力をログファイルに書き出す。
$now = Get-Date -format "yyyyMMdd_HHmmss"
cd "<path-to-program>"
./program.exe | Tee-Object -FilePath ($now + ".log")
スリープにはPSToolsのpsshutdown.exeを利用する。 引数によってシャットダウンとスリープを選択できる。 ここでは60秒後に実行するように設定している。
Param(
[Int]$arg = 0
)
# If arg is 0, Sleep. Otherwise, Shutdown.
if($arg -ne 0){
shutdown /s /f /t 60
}
else{
cd "<path-to-pstools>/PSTools"
./psshutdown.exe /d /t 60 /accepteula
}