Hey, Scripting Guy!

Hey, Scripting Guy!

新しい TechNet コラムへようこそ。このコラムでは、よく寄せられるシステム管理スクリプトに関する質問に Scripting Guys がお答えします。システム管理スクリプトについて質問がある場合は、scripter@microsoft.com (英語のみ) までお送りください。すべての質問に回答することはできないかもしれませんが、可能な限り対応いたします。

今日の質問 : スクリプトを使用してタスクのスケジュールを管理することはできますか


スクリプトを使用してタスクのスケジュールを管理することはできますか

Q

Scripting Guy さん、よろしくお願いします。スクリプトを使用してタスクのスケジュールを管理する簡単な方法はありますか。

-- RC

A

RC さん、こんにちは。その方法がどうしても知りたかったのだと思いますが、率直に言って、この分野はスクリプトの得意とするところではありませんし、回答を聞くと以前にも増して混乱する可能性もあります。でもとにかく始めることにします。

ここで問題となるのは、Windows にはタスクのスケジュール管理に使用するアプリケーション プログラミング インターフェイス (API) が 2 種類あり、しかも両者の間に完全には互換性がないことです。1 つ目の API はタスク スケジューラと Schtasks.exe (Windows XP および Windows Server 2003 に付属のコマンド ライン タスク管理ツール) の両方が使用するタスク スケジューラ API です。もう 1 つは、At.exe と WMI の Win32_ScheduledJob クラスが使用する At API です。

そのことで何が問題になるのでしょうか。たとえば、WMI を使用してタスクのスケジュールを作成するとします (この操作を行うサンプル スクリプトは後で紹介します)。その場合は、次のようなスクリプトを使用して、そのタスクと At API で作成された他のタスクに関する情報を取得できます。

strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colScheduledJobs = objWMIService.ExecQuery _
    ("Select * from Win32_ScheduledJob")
For Each objJob in colScheduledJobs
    Wscript.Echo "Caption: " & objJob.Caption
    Wscript.Echo "Command: " & objJob.Command
    Wscript.Echo "Days Of Month: " & objJob.DaysOfMonth
    Wscript.Echo "Days Of Week: " & objJob.DaysOfWeek
    Wscript.Echo "Description: " & objJob.Description
    Wscript.Echo "Elapsed Time: " & objJob.ElapsedTime
    Wscript.Echo "Install Date: " & objJob.InstallDate
    Wscript.Echo "Interact with Desktop: " & objJob.InteractWithDesktop
    Wscript.Echo "Job ID: " & objJob.JobID
    Wscript.Echo "Job Status: " & objJob.JobStatus
    Wscript.Echo "Name: " & objJob.Name
    Wscript.Echo "Notify: " & objJob.Notify
    Wscript.Echo "Owner: " & objJob.Owner
    Wscript.Echo "Priority: " & objJob.Priority
    Wscript.Echo "Run Repeatedly: " & objJob.RunRepeatedly
    Wscript.Echo "Start Time: " & objJob.StartTime
    Wscript.Echo "Status: " & objJob.Status
    Wscript.Echo "Time Submitted: " & objJob.TimeSubmitted
    Wscript.Echo "Until Time: " & objJob.UntilTime
Next

このタスクはタスク スケジューラにも表示されます。ここまでは問題ありませんね?

といっても、「タスク スケジューラを開いていれば、別のタスクのスケジュールも作成できるだろう」と思っているとしたら、それは可能ですが、そのタスクの情報は WMI スクリプトでは取得できません。タスク スケジューラは WMI で作成されたタスクを扱うことができますが、WMI はタスク スケジューラで作成されたタスクを扱うことができません。

さらに、タスク スケジューラを開き、WMI で作成したタスクを変更する場合、変更は可能ですが、そのタスクはもともと WMI で作成されたものであっても、WMI スクリプトからアクセスすることはできなくなります。皆さんの仰りたいことはわかります。この問題が将来の Windows バージョンで修正されることを願っています。このような言い方では助けにならないということもわかっています。申し訳ないと思います。

いったいどういうことかというと、WMI を使用してタスクのスケジュールを管理することは、行き当たりばったりの計画を実行するようなものだということです。タスク スケジューラを使用してタスクをスケジュールすることがまったくないのであれば、WMI はきわめて役に立ちます。しかし、WMI スクリプトとタスク スケジューラの両方を使用すると、タスク管理がかなり込み入った作業になります。

では、スクリプトを使用してタスクのスケジュールを作成するには、どのような方法を用いればよいのでしょうか。まず、次のサンプル スクリプトを試してみてください。

strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set objNewJob = objWMIService.Get("Win32_ScheduledJob")
errJobCreated = objNewJob.Create _
    ("Cleanup.exe", "********123000.000000-420", _
        True , 1 OR 4 OR 16, , , JobID) 
Wscript.Echo errJobCreated

少しわかりにくいでしょうか。このスクリプトは、Cleanup.exe という架空のプログラムを毎週月曜日、水曜日、金曜日の午後 12 時 30 分に実行するようにスケジュールします。このスクリプトで使用しているパラメータの詳細については、『Microsoft Windows 2000 Scripting Guide』 (英語) を参照してください。


関連情報

Hey, Scripting Guy! - アーカイブ もチェックしてください。

ページのトップへページのトップへ