Skip to content

透過 WMI 進行工作排程

一月 30, 2008

WMI 是很好用的工具,也因為它實在是太好用了,一直都會感覺摸不到深處,找不到高點。但是,如果你是要在 Windows 上快速的完成工作任務,我認為 使用 Script 並搭配 WMI 會是絕佳的選擇。

例如今天我想要透過 WMI 來進行某些例行工作的排程,簡單的做法可能是以 WSH 裡的 WScript.Shell 物件,去呼叫 AT 命令,然後把相關的參數丟進去就可以完成了。但總認為不是個聰明的做法。使用 WMI 裡的 Win32_ScheduledJob 類別,可以讓我們以更聰明、簡潔的方式,來建立工作排程。

MSDN 上便有良好的範例教我們怎麼使用 Win32_ScheduledJob 來建排程,請見︰WMI Tasks: Scheduled Tasks

首先建立 WMI Service 的物件,用這個物件來建立 Win32_ScheduledJob 的實體︰


set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
set objNewJob = objWMIService.Get("Win32_ScheduledJob")

接著,便可以呼叫 Create 方法,將排程建立起來︰


errJobCreate = objNewJob.Create _
("Notepad.exe", _
"********030000.000000+480", _
true, 1 or 32 or 64, , false, 247)

其中比較特別的地方應該是第二個參數,就是排程的時間,其格式請參考 MSDN 上的說明。通常來說,我們只會更動 “0300″ 這個部份,代表的意思就是小時+分鐘,0300 便是指凌晨三點會執行指定的 command。

而後面的 +480 比較好玩,它的算法並不是我們常用的 GMT 時間,而是將日光節約時間考慮進去的 PST 時間。轉換的做法便是將原本我們常用的 GMT 時間(+800),乘上 60 倍而得到 +480,即可以轉換成我們台灣時區的時間。

不過每次都建立新的工作排程也不是個好做法,希望能在建立排程前,就先檢查是不是有相同的工作排程已經存在,可以這樣查詢︰


' 先檢查是否有相同的排程工作存在
set colScheduledJobs = objWMIService.ExecQuery("Select * from Win32_ScheduledJob ")
for each objJob in colScheduledJobs
if objJob.Command = task_cmd then
wscript.echo "-->相同排程工作已被建立,將刪除排程重新建立"
objJob.Delete()
end if
next

如果有存在時,那麼就將之刪除。因此整個完整的 function 便長成像這樣子︰


function createScheduleTask(task_cmd, task_time)
set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")

' 先檢查是否有相同的排程工作存在
set colScheduledJobs = objWMIService.ExecQuery("Select * from Win32_ScheduledJob ")
for each objJob in colScheduledJobs
if objJob.Command = task_cmd then
wscript.echo "-->相同排程工作已被建立,將刪除排程重新建立"
objJob.Delete()
end if
next

set objNewJob = objWMIService.Get("Win32_ScheduledJob")
errJobCreate = objNewJob.Create _
(task_cmd, _
"********" & task_time & "00.000000+480", _
true, 1 or 32 or 64, , false, task_cmd)

if errJobCreate = 0 then
wscript.echo "-->排程工作已建立..."
else
wscript.echo "-->無法建立排程工作,錯誤碼: " & errJobCreate
end if

end function

WMI 是個好工具,當我們想要以程式的方式來解決一些特定領域的作時,善用 WMI 幫助寫程式還比直接硬刻來得有效率多了。

廣告
No comments yet

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 / 變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 / 變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 / 變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 / 變更 )

連結到 %s

%d 位部落客按了讚: