strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colInstalledPrinters = objWMIService.ExecQuery _
("Select * from Win32_Printer")
For Each objPrinter in colInstalledPrinters
objPrinter.CancelAllJobs()
Next
但要是您是使用 Windows 2000 的電腦作為列印伺服器呢? 這時候就有問題了: Windows 2000 並沒有 CancelAllJobs() 方法可從 Windows XP 和 Windows Server 2003 上的印表機刪除列印工作。不只如此,WMI 存放庫中甚至連旗鼓相當的方法都找不到。這就是殘酷的現實: 您不能使用 WMI 來刪除 Windows 2000 電腦上所有的列印工作。
這時候,只要是具有崇高品德的人一定就此打住,他們才不會為了刪除列印伺服器上區區幾個列印工作,而犧牲自己的原則。不過,Scripting Guy 就沒有這種包袱了;我們倒是可以提供一個 ADSI 指令碼,幫助您刪除 Windows 2000 電腦上所有的列印工作:
Set objComputer = GetObject("WinNT://atl-ps-01")
objComputer.Filter = Array("printQueue")
For Each objPrinter in objComputer
objPrinter.Purge
Next
如您所見,一開始我們是利用 WinNT 提供者連接到列印伺服器 atl-ps-01 (對了,WinNT 有大小寫之分;如果您用的是 winnt 或 WINNT 或其他大小寫組合,指令碼會無效),它會傳回 atl-ps-01 上所有「東西」的集合,或者至少是 ADSI 知道的所有東西,有使用者帳戶、群組、服務,連印表機也有。不過我們只關心印表機,所以就套用一個「篩選條件」,限它傳回 printQueue 物件;您可能也想到了,printQueue 就是 ADSI 對印表機物件的表示法。篩選條件只需一行程式碼:
objComputer.Filter = Array("printQueue")
順便提一下,我們篩選的物件 (printQueue),必須設定為陣列才行。這個程式碼看起來好像行得通,其實不然:
。
objComputer.Filter = "printQueue"
現在我們只能對印表機集合執行迴圈,然後針對每一個找到的印表機,刪除所有的列印工作,這個動作可以用 Purge 命令完成。要刪除所有印表機上所有的列印工作,只需要三行程式碼就行了:
For Each objPrinter In objComputer
objPrinter.Purge
Next
不賴吧?如果您想獲得更多有關在 Windows 2000 上管理列印伺服器的資訊,可以看看《Microsoft Windows 2000 Scripting Guide》的<Printing> (英文) 一章。如果您想獲得其他例外的相關資訊,只要繼續閱讀本專欄,一定會遇到幾個之前所提規則的例外狀況。 |