このページの本文へ

Windows Info 第363回

Windowsのタスクスケジューラーをもっと使いこなす

2023年01月22日 10時00分更新

文● 塩田紳二 編集● ASCII

  • この記事をはてなブックマークに追加
  • 本文印刷

 プログラムを定期的に実行する、あるいは起動時やログオン時に実行したいとき、タスクスケジューラが利用できる。

 しかし、Windowsのタスクスケジューラは、Windowsの標準機能の中でも複雑なものの1つだろう。タスクスケジューラのAPIを解説したドキュメントはあるのだが、GUIアプリケーションの「タスクスケジューラ」(以下タスクスケジューラ・アプリ)については古いものしかない。

●Task Scheduler Overview(英語)
 https://learn.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2008-r2-and-2008/cc721871(v=ws.11)

 タスクスケジュール機能は、アプリだけでなく、schtasks.exeコマンドからも操作できる。Windowsは、タスクスケジューラAPIを提供しているため、WSHやPowerShellなどのスクリプティング言語、C++/C#などのコンピュータ言語からも利用が可能だ。

 毎日/毎週/毎月などの定期的な実行や、PCの起動時、ユーザーのログイン時、PCがアイドルになったときなどのタイミングで、任意のプログラムを実行できる。また、タスクスケジューラからは、プログラムを管理者権限で起動させることにも対応している。

タスクスケジューラ・アプリ

 GUIプログラムでもコマンドでも、Windowsのタスクスケジュール機能としては同じものを扱う。ここではタスクスケジューラ・アプリを見ることで、Windowsのタスクスケジュール機能を見ていこう。このアプリを理解できれば、スクリプトでもコマンドでもAPIでも記述が異なるだけで基本的な考え方は同一である。

 タスクスケジューラ機能は、「タスク」を登録して管理する。「タスク」は、「トリガー」が成立し、かつ「条件」が満たされたときに「操作」(プログラム)を実行する処理だ。

 ただし、ユーザーがマシンの前で見守って実行するものではないために、いくつかの安全策がある。たとえば、プログラムがいつまでたっても終了しない、あるいは次の実行をするときに、同じタスクで前回起動したプログラムが実行中だったという場合などだ。普通にWindowsを使っているときでも遭遇する状況だが、タスクスケジューラ機能では、ユーザーの操作が不要、あるいはできないことを前提にしているため、事前にタスクにさまざまな条件を指定しておく必要がある。

 タスクスケジューラ・アプリを起動すると全体は大きく4つの領域に分かれている。

タスクスケジューラ・アプリは大きく4つの領域を持つが、右端は「操作ウィンドウ」で実行可能な操作を並べるMMCの機能。これはタスクバーボタンで非表示にできる。左側がコンソールツリーウィンドウ、中央下がプレビューウィンドウという名前を持つ。中央上の部分には名称がないようなのでこの記事ではタスクリストウィンドウと呼ぶ

 左側の領域は「操作ウィンドウ」と呼ばれ、代表的な操作を登録してある領域であり、ツールバー左端のボタンでオフにできる。そもそもこのウィンドウは、「Microsoft管理コンソール」(MMC、Microsoft Management Console)のウィンドウなので、イベントビューアーやコンピュータの管理などと同じ構造である。

 右側が「コンソールツリーウィンドウ」で、登録されているタスクがツリー構造で表示される。中央上の部分は、コンソールツリーウィンドウで選択したフォルダーに含まれる「タスク」のリストが表示される。ここは特に名称を持たないようなので、この記事では「タスクリストウィンドウ」と呼ぶことにする。この下は「プレビューウィンドウ」と呼ばれ、上で選択したタスクの情報が表示される。

 タスクの登録は、コンソールツリーウィンドウでフォルダを選択して「操作」メニューの「タスクの作成」を選び、「タスクの作成」ダイアログボックスを表示させる。既存のタスクの編集は「プロパティ」ダイアログボックスでする。フォルダーによっては、アクセス権が設定されていて、ユーザーが新規タスクを登録できず、メニュー項目も出ないことがある点に注意してほしい。

 基本的にユーザーがタスクを登録する場合、コンソールツリーウィンドウで「タスク スケジューラ ライラブラリ」を右クリックして「新しいフォルダー」を選択し、自分用のフォルダーを作ることをお勧めする。このようにすることで、自分で作成したタスクだけをタスクリストウィンドウに表示させることができる。

タスクのプロパティ

 タスクのプロパティ/タスクの作成ダイアログの設定項目が、Windowsが管理する「タスク」の基本的な情報を網羅する。なので、このダイアログを理解することでWindowsのタスクスケジューラ機能の基本を理解できる。

 ここには、「全般」「トリガー」「操作」「条件」「設定」の5つのタブと「履歴」タブがある。

プロパティダイアログ「全般」タブ。このダイアログには6つのタブがあるが、右端の「履歴」タブは標準状態で履歴機能がオフなので「(無効)」と表示される。全般タブは、タスクの名前やセキュリティオプションを設定する

 「履歴」タブは、タスクの実行履歴を表示するためのものだが、デフォルトではすべてのタスクの履歴記録がオフになっている。履歴が無効でも、タスクリストウィンドウには、前回の実行日時と実行結果が表示され、これで用が足りることがほとんどだ。なお、タスクの新規作成時には「履歴」タブは表示されない。

 「全般」タブには、タスクの基本情報を登録する。タスクの名前や実行するユーザーアカウント名などだ。また、ここで「最上位の特権で実行する」を選択すると管理者ユーザーアカウントによるタスクならば管理者権限でプログラムを起動できる。

 Windows PowerToysは、ユーザーのログイン時に自動的に起動する設定が可能だが、その機能の一部は管理者権限が必要になる。スタートメニューの「オートスタート」やレジストリからの自動実行では、セキュリティ上の理由から、一般ユーザー権限での起動しかできず、管理者での起動はできない。このため、PowerToysはタスクスケジューラを使って、自分自身を管理者権限でユーザーログイン時に起動するように登録している。

 「トリガー」タブは、タスクの実行開始条件を指定する。複数のトリガーを指定でき、トリガーのどれか1つが成立すればタスクの実行開始条件となる。

トリガータブは、タスクを起動するトリガー条件を指定する。時間やWindowsの起動、ユーザーのログイン、アイドルなどが指定できる。1つのタスクに最大32個のトリガーを指定できる

 トリガーは、以下の表のように大きく10種類ある。

 このうち「スケジュールに従う」が時刻に関連して起こるトリガーで、「1回」「毎日」「毎週」「毎月(日付または曜日)」の起動パターンと、繰り返しを終了する日時を指定できる。

 「イベント時」は特定のイベントが発生し、これがイベントログに記録されたタイミングでの実行だ。そもそもイベントスケジューラは、プロセスとしての優先度が高くなく、何かに応じて即座に、あるいはリアルタイムでタスクを起動するのではなく、システムの負荷状態やスリープ状態などによっては、条件を満たしたタイミングと実行のタイミングが秒単位以上でずれる可能性がある。このため「イベント発生からXミリ秒以内」のような正確なタイミングで何かを実行することはできないと考えておいた方がいい。

 「操作」タブは、起動するプログラムを登録する。

操作タブは、タスクで実行するプログラムを指定する。コマンドラインオプションは必ず「引数の追加」に記述する。「開始」はプログラムのカレントディレクトリを指定するもの

 機能としては、メール送信やメッセージ表示(メッセージボックス)があるが、現在では「非推奨」で、実行ファイルによるプログラム起動のみと理解したほうがよい。なお、「プログラム/スクリプト」欄には、実行ファイルへのフルパスのみを指定し、コマンドライン引数は必ず「引数の追加(オプション)」に別に記述する。「開始(オプション)」は、実行ファイルのカレントディレクトリをフルパスで指定する。引数・カレントディレクトリともに「オプション」とあるのは、指定が必須ではないという意味である。

 「条件」タブは、トリガーが成立したとき、プログラムを起動する条件を指定するもの。ここにある「タスクを実行するためにスリープを解除する」を使うと、スリープ状態にあるマシンが自動で復帰してタスクを実行できる。また、特定のネットワークに接続しているときのみ、AC電源で動作しているときのみ、アイドル時のみ、といった条件を指定できる。

条件タブは、トリガーが成立したときにプログラムを実行する条件を指定する。アイドル時間やバッテリ状態、ネットワークの接続状態などを指定できる。また「タスクを実行するためにスリープを解除する」でスリープ状態でもタスクを起動可能にできる

 「設定」は、タスク自体の設定項目である。「タスクを要求時に実行する」は、タスクリストウィンドウで、タスクを選択して「実行する」を選択したときに実行するかどうかを設定するもの。これをオフにしても、トリガー条件などでタスクは実行される。トリガーによるタスクの実行を止めるには、タスクリストウィンドウでタスクを選択して右クリックメニューで「無効」を設定する。

設定タブは、タスクの設定項目を指定するもの。電源オフで実行できなかったときや、タスクが失敗したときのリトライ回数、タスクの最大実行時間などを指定する

 「タスクを要求時に実行する」をオフにしておくとタスクの手動起動を禁止できる。特に管理者権限を指定した場合には、オフにして手動実行(schtasks.exeコマンドからの起動など)を禁止したほうがよい。過去には、タスクスケジューラにプログラムを登録して管理者権限を奪うというマルウェアがあった。

 起動時に管理者権限でアプリを起動する、アイドル時間に作業するなど、タスクスケジューラには意外に使い道がある。スケジュール指定では、毎月の最終日、あるいは最終週といった指定が可能で、スリープ状態を解除して夜中に無人で実行することもできる。

 ただし、そこはコンピュータのすることなので、実行するプログラムは事後に処理が取り消し可能なものにしておいたほうが無難である。特に自作のスクリプトは十分注意して作成する必要がある。タスクスケジューラを使うよりも、タスクスケジューラで問題を起こさないスクリプトを書く方が格段に難しいのだ。

カテゴリートップへ

この連載の記事

注目ニュース

ASCII倶楽部

プレミアムPC試用レポート

ピックアップ

ASCII.jp RSS2.0 配信中

ASCII.jpメール デジタルMac/iPodマガジン