背景
タスクスケジューラで無期限に定期実行(5分おきetc.)しているタスクがある。
その中に、外部サービスにアクセスするタスクがあるのだが、外部サービスが不定期にメンテナンスによりアクセスできなくなる時間帯がある。
アクセスに失敗した場合、アクセス元のバッチファイルが、エラー通知を送信する仕様にしていたため、メンテナンス時間帯にエラー通知が継続的に発報されてしまう。
定期メンテのアナウンスを受けたら、メンテナンスの計画時間中はタスクスケジューラの所定のタスクを停止することで、エラー通知が発報されることを回避したいと考えた。
環境
以下の環境で試行した。
- Windows 11 Pro
- Windows Server 2019
アプローチ1(結果:失敗)
操作内容が同じ2つのタスクを用意して、1つはメンテナンス予定日時の前に有効期限を指定することでタスクを停止して、
もう1つは、メンテナンスの開始予定日時の後に開始時間を指定する方法を考えた。
このアプローチは、以下の事象により実現できなかった。
トリガーの設定にて、有効期限を指定したが、有効期限の時間を過ぎてもタスクは継続して実行されてしまった。
同様の事象で詰まっていた記事を見つけた1。
アプローチ2(結果:成功)
PowerShellのコマンドにより、タスクスケジューラのタスクを操作できると知った2ので、タスクを停止/再開するコマンドをタスクスケジューラで実行することにした。
タスクスケジューラの有効化/無効化を操作するコマンド
- タスクスケジューラのタスクを無効化するコマンド
Disable-ScheduledTask -TaskName "タスク名"
- タスクスケジューラのタスクを有効化するコマンド
Enable-ScheduledTask -TaskName "タスク名"
計画停止/再開タスクの作成
以下のような構成でメインのタスクと別に2つのタスクを作成した。
計画停止のタスクの設定
トリガー
操作
- 操作:プログラムの開始
- 設定
- プログラム/スクリプト
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe - 引数の追加
-Command Disable-ScheduledTask -TaskName "メインのタスク"
- プログラム/スクリプト
計画開始のタスクの設定
トリガー
操作
- 操作:プログラムの開始
- 設定
- プログラム/スクリプト
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe - 引数の追加
-Command Enable-ScheduledTask -TaskName "メインのタスク"
- プログラム/スクリプト
まとめ
アプローチ2の方法で、目的を達成できました。
上記記載例だと、2025/1/19の2:00にタスクが停止して、3:00にタスクが再開することになります。