嗨,Scripting Guy!

Hey,Scripting Guy!

歡迎使用全新的 TechNet 專欄,Microsoft Scripting Guys 會在此為您解答有關系統管理指令碼的常見問題。您有關於系統管理指令碼方面的問題嗎?請將電子郵件傳送到 scripter@microsoft.com。我們無法保證能夠逐一回答每個問題,不過我們會盡力而為。

今天的問題:是否有方法,可以判斷一部電腦的預設印表機?


是否有方法,可以判斷一部電腦的預設印表機?

嗨,Scripting Guy!是否有方法,可以判斷一部電腦的預設印表機?

-- JW

JW,您好。如果您執行的是 Windows XP 或 Windows Server 2003,很容易判斷預設的印表機。因為在這兩種版本的 Windows 中,WMI 類別 Win32_Printer 均含有一個名為 Default 的屬性。就如字面上的意思,您能透過這個屬性得知哪一部才是預設的印表機:如果此值為 TRUE,則該裝置即為預設的印表機;如果此值為 FALSE,那就不是。要找出一部電腦上的預設印表機,您只需要查詢 Default 屬性為 TRUE 之所有印表機的集合即可 (因為預設印表機只能有一部,因此這個集合將只會包含一個項目): :
strComputer = "."
Set objWMIService = GetObject _
    ("winmgmts:\\" & strComputer & "\root\cimv2")
Set colPrinters = objWMIService.ExecQuery _
    ("Select * From Win32_Printer Where Default = TRUE")
For Each objPrinter in colPrinters
    Wscript.Echo objPrinter.ShareName
Next

唉,真想不通,怎麼還會有人宣稱沒有必要升級至 Windows XP 或 Windows 2003!

想必這時候,已經有人開始傷腦筋了:「他們只說,如果執行的是 Windows XP 或 Windows 2003 的話,這件工作就十分簡單。卻沒有提到 Windows 2000,而我執行的正是 Windows 2000;難道 Windows 2000 根本就做不到這件事,還是情況會變得十分棘手?」

嘿,放輕鬆一點!您可以使用 WMI 判斷 Windows 2000 上的預設印表機。情況並不真的那麼棘手,只是需要一點小技巧罷了。這是因為 Windows 2000 (以及 Windows NT 4.0 和 Windows 98) 上的 Win32_Printer 類別沒有 Default 這個屬性。因此,單純查詢 Default 值為 TRUE 之印表機的作法,在這裡就行不通了。

不過沒關係。這些舊版 Windows 上的 Win32_Printer 類別中,確實含有一個名為 Attributes 的位元遮罩屬性。我們現在還無法開始說明何謂「位元遮罩」(如需詳細資訊,請參閱 Microsoft Windows 2000 指令碼指南 中的對應章節)。但我們至少可以這麼解釋:單一位元遮罩就像是具有一排開關的儀表板。在這個範例中,每個開關都代表了一部印表機的屬性。開關處於開啟狀態時,代表該屬性為 TRUE。開關處於關閉狀態時,代表該屬性為 FALSE。就 Win32_Printer 而言,值為 4 的位元 (開關),就代表了 Default 屬性。如果此位元處於開啟狀態,則這部印表機就是預設的印表機;反之則否。

更詳細地說:如果要判斷 Windows 2000 電腦上的預設印表機,我們只需要擷取「所有」印表機的集合,再分別檢查每部印表機的 Attributes 屬性即可。如果我們發現一部印表機,其值為 4 的位元正處於開啟狀態,則該部印表機就是預設印表機。

以下指令碼作的就是這項工作:

Const DEFAULT = 4
strComputer = "."
Set objWMIService = GetObject _
    ("winmgmts:\\" & strComputer & "\root\cimv2")
Set colPrinters = objWMIService.ExecQuery _
    ("Select * From Win32_Printer")
     
For Each objPrinter in colPrinters
    If objPrinter.Attributes And 4 Then 
        Wscript.Echo objPrinter.ShareName
    End If
Next

如果您對位元遮罩並不熟悉,上面的這段指令碼可能沒有太大的意義。但是沒有關係;請先直接使用這個指令碼,等到有機會時,再好好閱讀有關位元遮罩的資訊。


如需詳細資訊

查看嗨,Scripting Guy!- 過往文件

 

回到頁首 回到頁首