schtasks コマンドでリマインダーを実現する

以前 Windows の at コマンドでリマインダーを作ろうとした けど、at コマンドは Windows によっては使えない。代わりに schtasks コマンドを使うようになっている。

ならば、と schtasks でもリマインダーを実現できないかを調べてみた。

結論

  • schtasks はコマンドラインが煩雑なので、素で使うのはキツイ
  • リマインダーを実現したいならラッパースクリプトとか書いた方がいいと思う

前提

以下のようなシンプルなリマインダーを想定。

  • 今日の HH 時 MM 分になった時に指定メッセージを表示させたい
  • リマインド設定時に与えるもの
    • HH:MM
    • メッセージ
  • メッセージ表示 = メッセージを書いたテキストファイルを開く、とする

リマインダーを登録する

$ schtasks /create /sc once /tn タスク名 /tr "起動したいテキストファイルのパス" /st HH:SS /f

パラメータについては以下のとおり。

  • タスク名
    • リマインダーの名前を指定
    • 例: reminder1
  • パス
    • 起動したいコマンドラインを指定
    • ここではテキストファイルパスを想定(関連付けられたテキストエディタで開かれる)
  • HH:SS
    • リマインド日時を指定
    • 現在時刻より1分以上遅い時刻にすること
    • 現在時刻以下だと『/ST が現時刻よりも早いため、タスクは実行されない可能性があります』警告が出るし、実際実行されない

新規も設定もこれ一本で済む。

リマインダーをn個作りたければ「タスク名」をn個分指定する。

登録したリマインダーを見る

$ schtasks /query /tn タスク名 /fo list

フォルダー\
ホスト名:        XXXXXXXXX
タスク名:        \(ここにタスク名が表示される)
次回の実行時刻:  ★1
状態:            準備完了
ログオン モード: 対話型のみ

★1 については以下の通り2パターン。

リマインダーを設定していない場合:

  次回の実行時刻:  N/A

リマインダーを設定している場合:

  次回の実行時刻:  2018/07/30 16:39:00

登録したリマインダーをお試し実行する

$ schtasks /run /tn reminder1
成功: スケジュール タスク "reminder1" の実行が試行されました。

シンプルなので解説は無し。が、一つ高度な補足説明をしておく。

リマインダー登録時にコマンドラインを同期実行させていると、以下のように連続で実行できない。実行させたいなら、実行されたプログラムをいったん終了させる必要がある。

$ schtasks /run /tn reminder1
成功: スケジュール タスク "reminder1" の実行が試行されました。

$ schtasks /run /tn reminder1
情報: スケジュール タスク "reminder1" は現在実行中です。
成功: スケジュール タスク "reminder1" の実行が試行されました。

$ schtasks /run /tn reminder1
情報: スケジュール タスク "reminder1" は現在実行中です。
成功: スケジュール タスク "reminder1" の実行が試行されました。

★ここで最初に試行した時に実行されたプログラムを終了させたとする★

$ schtasks /run /tn reminder1
成功: スケジュール タスク "reminder1" の実行が試行されました。

/create 時のオプションについて

$ schtasks /create /sc once /tn タスク名 /tr "起動したいテキストファイルのパス" /st HH:SS /f

/sc once

一度だけ実行されるスケジュールを登録する、の意。

本当は hourly(一時間毎)、daily(一日毎)、みたいな定期指定もできるのだが、今回は扱いを単純にするため ONCE(一度実行したら即終わり) という最も単純なオプションを使うことにした。

/tr コマンドライン

実行させたいコマンドラインを指定。

例として複雑なコマンドラインを書きたい場合を示す。以下はテキストファイルを非同期に実行させる例。

$ schtasks /create /sc once /tn タスク名 /tr "cmd /c start \"\" \"起動したいテキストファイルのパス\"" /st HH:SS /f
  • Point1: start コマンドで非同期的に実行させる
  • Point2: でも start コマンド単体では動かないので cmd を経由させる
  • Point3: 二重引用符は \ でエスケープして記述する

非同期に実行させることのメリットは schtasks /run による試行を(起動したプログラムを終了させることなく)何度も試せることくらいか。

/f

上書き登録時の確認メッセージを省く。

省かないと以下のような確認が出てきて邪魔くさい。

$ schtasks /create /sc once /tn reminder1 ...(略)...
警告: タスク名 "reminder1" は既に存在します。置き換えますか (Y/N)?

感想

  • schtasks はコマンドラインオプションが豊富なので不自由は無い
  • しかし煩雑なので、これを素でリマインダーとして使うのは苦しい
    • 何らかのラッパースクリプトを書くのが良いだろう
  • schtasks の使い方で困ったら /? でヘルプ見ればいい