kkamegawa's weblog

Visual Studio,TFS,ALM関係のことについていろいろと書いていきます。Google Analyticsで解析を行っています

Windowsスケジュール機能の変遷

Windowsのスケジュール機能は大きく分けて三世代あります。

Windows 7/Windows Server 2008 R2でもこれら全部サポートしているとはびっくりです。もういい加減ATコマンド消滅でもいいと思うんですが。

ATコマンドのSchedulerサービス

いまだに出てくるATコマンド。なんとWindows 7でもまだ生き残っています。プログラムからの制御はできないのかな?ちょっと見た記憶がありません。登録済みかどうかは標準出力を解析するしかないんでしょうかね。
[HOWTO] AT コマンドを使用してタスクをスケジュールする方法

Windows 2000/Windows XP/Windows Server 2003のSchedulerサービス

ATコマンドも生き残っていますが、より柔軟に登録できるSchtasksコマンドができました。
Windows Server 2003 で Schtasks.exe を使用してタスクをスケジュールする方法
Microsoft Corporation
APIもちゃんと用意されています。
Task Scheduler 1.0 Interfaces (Windows)
Task Scheduler 1.0 Enumerated Types (Windows)
タスクスケジューラーのUIでできることはできるようです。タスク情報は拡張子jobというファイルで保存されていて、以下のレジストリに格納場所があります。このレジストリWindows 7でも残っています。私登録済みのジョブ検索するの面倒になって、ここのフォルダでjobファイル列挙して探していたら、Windows Server 2008のUIから登録したタスクとか表示できなくて涙目…。別の理由もあって、作り直すことにしました。
タスク スケジューラは、Windows Server 2000 または Windows Server 2003 のいずれかのコンピューターでのサービス コンソールからタスク スケジューラ サービスを開始しようとすると問題が発生します。

Windows Vista/Windows Server 2008以降のVer2 Scedulerサービス

Windows Server 2008/VistaではVer2となって、かなり強化されました。Interfaceもごっそり変更されましたが、Ver1仕様のものも残っているので、そのまま実行することができますが、Ver2の恩恵は受けられません。

  • タスクでメール送信ができるようになった(ただしsubmission portには対応してないようです)
  • 階層構造が作れるようになった。"Owner\Product\Task1"とかという形式で指定すると、自動的に階層になります。多くのタスクを登録するような場合便利でしょう。
  • XML(ただしUTF-16LE)で作ったXMLファイルをインポートできるようになった。作成と別にできて便利です。
  • 「表示しない」が選べる。これもコマンドツールとか裏で動いてほしいものをあやまって終了してしまわないので便利ですね。
  • トリガーが時間以外にもいろいろ可能。以前も「ログオン時」に動かすという設定はできていたのですが、個人的な経験ではあまり期待通りに動いてくれないような…気がします。ユーザーセッションの接続/切断は地味に便利かもしれません。イベントログをトリガーにできるのはうれしいですね。
  • タスクの重複起動の抑止。これもXPではなかったと記憶しています。
  • 「月末」の指定ができるようになったこと(1/31,2/28,4/30など)。これができなくて、業務でタスクスケジューラーを使おうとすると、かなり苦労していました…。うるう年大丈夫だよね(^^;。

Interfaceもずいぶん増えました。
Task Scheduler 2.0 Interfaces (Windows)
Task Scheduler 2.0 Enumerated Types (Windows)
ちょっとだけ問題があるとすれば、タスクスケジューラーの時間。XML SchemaのDateTimeの形式で返却されるのです。マネージドであれば、ちゃんとDateTime型でサポートしてくれるからいいのですが、アンマネージドであれば…パーサーが標準でないっぽい?
twitterで聞いたところ、Windows Web Serviceにあると教えていただきました。しかし、これWindows 7/R2専用(これは多分クリアできそう)な上に、ちょっと大げさかなぁ…。Shell Lightweight APIあたりにのらなかったのが残念です。自力で書いても全然問題ないといえばないのですけど。