かつて山市良と呼ばれたおじさんのブログ
セイテクエンジニアのブログ かつて山市良と呼ばれたおじさんのブログ vol.212 タスクスケジューラともっと仲良くなろう|セイテク・シス管道場(Web)
2026年06月22日配信
2026年06月22日更新
執筆者:山内 和朗
「セイテク・シス管道場(Web)」では、Windows Serverの要素技術やシステム管理の基本的な部分に焦点を当ててきました。シリーズ最後(予定)のテーマはタスクスケジューラです。このツールの詳細な使い方を説明するつもりはありません。ちょっと面白い使い方をいくつか紹介します。
Windowsのタスクスケジューラ(Scheduler)サービスを使用すると、コンピューターで運用管理タスクを自動実行できます。タスクスケジューラでは、システム起動時、ユーザーログオン時、指定した日時または繰り返しスケジュール、オンデマンド実行で指定したプログラム(バッチやスクリプトを含む)を開始できます。Windowsのシステムやアプリケーションもさまざまなタスクを使用して、メンテナンスタスクなどを自動実行しています。
「タスクスケジューラ」(Taskschd.msc)は、タスクの作成と管理のためのGUI管理ツールです。タスクの設定は一見すると設定項目が多くて難しそうに見えますが、ウィザードや設定プロパティをよくよく見れば、詳しい知識を持たなくても期待通りのカスタムタスクを作成して、スケジューリングできるはずです。重要なのは、対話なしで動く処理を作れるか、コマンドラインやバッチ、スクリプトを準備できるかどうかです。バッチやスクリプトを準備できたら、タスクの「操作」タブに次のように指定して、あとは「全般」タブでログイン条件や実行アカウント、「トリガー」タブでタスクを開始するトリガー条件を指定すれば概ね完了です。
| プログラム/スクリプト | 引数の追加 |
| バッチファイル(.bat、.cmd)のパス | [バッチに渡す引数] |
| cmd.exe | /c "バッチファイル(.bat、.cmd)のパス [バッチに渡す引数]" |
| cmd.exe | /c "コマンドライン" |
| powershell.exe | -ExecutionPolicy Bypass -File "PowerShellスクリプト(.ps1)のパス" [スクリプトに渡す引数] |
| powershell.exe | -ExecutionPolicy Bypass -Command "& { スクリプトブロック }" |
| cscript.exe | //NoLogo "WSHスクリプト(.vbs、.jsなど)のパス" [スクリプトに渡す引数] |
他に注意点があるとすれば、「全般」タブの「セキュリティオプション」の指定です。「ユーザーがログオンしているかどうかにかかわらず実行する」を選択する場合は、セッション「0」で実行されることに注意が必要です。その際、実行ユーザー「SYSTEM」を指定するとタスクの設定保存時にパスワードは要求されません。「SYSTEM」以外のユーザーを指定する場合は、そのユーザーのパスワードの入力が求められます。また、実行ユーザー「SYSTEM」の場合、「最上位の特権で実行する」オプションの指定は不要です。それ以外の場合で実行ユーザーでUAC(ユーザーアカウント制御)が有効になっている場合で、実行するタスクがフルトークン権限を必要な場合は、「最上位の特権で実行する」をチェックします。
この他のタスクスケジューラの細かい設定について説明はしません。詳しくは以下の公式ドキュメントで確認してください。
タスク スケジューラについて|Windowsアプリ開発(Microsoft Learn)
タスクはschtasksコマンドやPowerShellのScheduledTasksモジュールで操作することもできます。タスクのオンデマンド実行や無効化、有効化のコマンドラインを覚えておくと便利でしょう。別のタスクを有効化/無効化するタスクを作成するのに使えます。あとは、次回実行スケジュールを変更するコマンドラインも便利ですが、方法はケースバイケースなので説明は省きます。
| Start-ScheduledTask -Taskname "タスク名" schtasks /run /tn "タスク名" Disable-ScheduledTask -TaskName "タスク名" schtasks /change /tn "タスク名" /disable Enable-ScheduledTask -TaskName "タスク名" schtasks /change /tn "タスク名" /enable |
schtasks commands|Windows Server(Microsoft Learn)
ScheduledTasks Module|Microsoft 365(Microsoft Learn)
| cmd.exe /c start "" /min powershell.exe -Command "& {Add-Type -AssemblyName System.Speech; $speak = New-Object System.Speech.Synthesis.SpeechSynthesizer; $speak.Speak('おはようございます。今日もお仕事がんばりましょう!')}" |

もう少し役に立つ、そして勉強になるタスクの例を紹介しましょう。前回はイベントビューアーとタスクスケジューラの連携の話をしましたが、前回も少し触れた、パフォーマンスモニターのデータコレクターセットとの連携をやってみましょう。
パフォーマンスモニターを使用して、ユーザー定義のデータコレクターセットとしてパフォーマンス警告のデータコレクターを作成し、パフォーマンスカウンター「¥LogicalDisk(C:)¥% Free Space」に対する警告として制限値(50%以下など)を設定し、1日1回実行するようにします(画面2)。

画面2 パフォーマンス警告を作成する
「警告の動作」では、アプリケーションイベントログへの記録と、別のデータコレクターセットの開始を指定できます(画面3)。ちなみに、ここのアプリケーションログとは、WindowsログのApplicationではありません。アプリケーションとサービスログのほうの、Microsoft-Windows-Diagnosis-PLA/Operationalに記録されます。実は、私自身Applicationログだと思って、書き込まれないことに不思議に思っていたのですが、vol.209のイベントログのリアルタイム監視(イベントログを tail -f 風に監視する)のテクニックでこの場所を見つけました。

画面3 「警告の動作」タブのアプリケーションイベントログとは、Applicationではなく、Microsoft-Windows-Diagnosis-PLA/Operationalのほう(イベントID 2031)
「警告のタスク」では、警告が発生したときに、タスクスケジューラに登録されている特定のタスクを実行させることができます。この機能のポイントは、タスクに引数を渡せるということです。その細かい仕様は公開されていないようですが、数個の引数であれば問題なく渡すことができます。タスク側では、引数を$(Arg0)、$(Arg1)、$(Arg2)...(大文字小文字を区別)で受け取ることができます。なお、タスクに引数を動的に渡すことができるこの便利機能は、私が知っている限り、データコレクターセットにしかないようです。前回のイベント時トリガーではXPATH式を変数("$(値の名前)")として渡せますが、タスクスケジューラの外部から引数を渡せるのはデータコレクターセットだけだと思います。
例えば、タスクスケジューラライブラリにトリガーなしの「msg」という名前のタスクを作成し、「msg.exe * $(arg0)」を実行するように設定しておきます。このようにタスクを準備しておけば、「警告のタスク」の「警告が出されたときに実行するタスク」にタスク名「msg」を指定し、「タスクの引数」に引数を指定することで、警告発生時にタスクに引数を渡して実行させることができます(画面4)。引数として、警告対象のカウンターの値を置換変数 {value} *1’(大文字小文字区別しない)で渡すこともできます。利用可能な置換変数は、「タスクの引数」テキストボックスの横にある「>」ボタンで確認、挿入することができます。
*1 パフォーマンス警告のタスクで{value}以外に利用可能な置換変数については、右を参照。 IAlertDataCollector::put_TaskArguments メソッド (pla.h)|Windows アプリ開発(Microsoft Learn)
画面4 C:ドライブの容量がしきい値に達すると、Windowsからこんなメッセージが来る
パフォーマンスモニターのデータコレクターセットとタスクスケジューラの連携機能をもう1つ紹介します。タスクはパフォーマンス警告のデータコレクターだけでなく、データコレクターセットのレベルでも利用できます。データコレクターセットのレベルでは、データコレクターセットの停止時に特定のタスクを自動実行させることができます。こちらも、いくつかの置換変数(例、{logs})*2を含む引数の引き渡しが可能です。
この機能の活用例としては、ログのクリーンアップがあります。データコレクターセット自身もデータマネージャーというログ管理機能を持ちますが、いまいち設定方法がわかりにくいところがあります。データコレクターセットの停止時タスクを利用すれば、独自のスクリプトで簡潔にログをクリーンアップできます。
次のPowerShellスクリプト「CleanupLog.ps1」は、引数にログファイルのパス(例、"C:¥perflogs¥Admin¥Hyper-VHostLog¥*.blg"と日数(例、30)を指定して実行することで、指定した日数より古いファイルをすべて削除します。
[CleanupLog.ps1](プレーンテキストで表示、ダウンロード)
タスクスケジューラには、このスクリプトを実行するトリガーなしのタスク(例、MyLibrary¥CleanupLog)を作成し、次のコマンドラインを実行するように設定します。あとは、データコレクターセットの「タスク」タブで、「データコレクターセットの停止時にこのタスクを実行」にタスク名を指定し、引数にログファイルのパスと日数の2つの引数を設定すれば完了です(画面5)。例えば、データコレクターセットが1日ごとにログを切り替える場合、切り替え時のデータコレクターセット停止時、つまり毎日1回、クリーンアップ処理が行われることになります。なお、ログファイルのパスは置換変数{logs}*2で渡すこともできます({logs}は停止時のログのパス 《C:¥Peflogs¥Admin¥Hyper-VHostLog¥DataCollector01000036.blgなど》に展開されます)。上記スクリプトでは、渡されたパスのファイル名を *.blg に置き換えます(コードの太字部分)。
*2 データコレクターセットのタスクで利用可能な変数については、右を参照。 IDataCollectorSet::get_TaskArguments メソッド (pla.h)|Windows アプリ開発(Microsoft Learn)
| powershell.exe -ExecutionPolicy Bypass -File "C:¥work¥CleanupLog.ps1" $(Arg0) $(Arg1) |

画面5 データコレクターセットレベルのタスクで、ログのクリーンアップ処理をタスクで実行する例。「タスクの引数」は {logs} 30 で渡すことも可能
セイテク・シス管道場(Web) (1) |・・・|(10)|(11)|(12)|(13)|(14)|(15)|(16)|(17)|(18)|(19)|(20)