問:
您好,指令碼專家!有沒有辦法使用指令碼來確定電腦是否有 USB 2.0 連接埠?
-- RD
答:
您好,RD。您熟悉電影瘋狂星期五 (Freaky Friday) 嗎,電影中母親和女兒交換了身體(及角色)?嗯,我們的這個問題中有點類似瘋狂星期五的東西。畢竟,在本專欄中本來應該由“指令碼專家”來協助您。但是,此問題實際上卻協助了一位“指令碼專家”。他原來一直在嘗試測試 USB 裝置(未成功),而且幾乎已經把這項工作視為毫無意義。但是當閱讀到您的問題時,他心中暗想,“哎呀,對啊:USB 1.1 和 USB 2.0”。他在 USB 1.1 插槽中一嘗試測試該裝置(對照 2.0 插槽),問題馬上就解決了。
嗨,沒有人說過這個特別的“指令碼專家”是天才。(編輯附註:我為此證明。)
我們欠您一份情,RD;我們該如何報答您呢?好主意:也許我們可以從回答您的問題開始。好的,這裡有一個指令碼,它很可能返回電腦上 USB 2.0 連接埠的數量。讓我們先看代碼,然後再解釋我們說它“很可能”返回連接埠數量的原因:
複製代碼 代碼如下:strComputer = "."
i = 0
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colControllers = objWMIService.ExecQuery _
("Select * From Win32_USBController")
For Each objController in colControllers
If Instr(objController.Name, "Enhanced") Then
i = i + 1
End If
Next
Wscript.Echo "No. of USB 2.0 Ports: " & i
這個指令碼首先為兩個變數進行了賦值。為變數 strComputer 賦予了點 (.),點(WMI 標記法)代表本機電腦。同時,為計數器變數 i 賦值 0;我們將使用此變數來作為所有找到的 USB 2.0 連接埠的活動計數器。
串連到 WMI 服務後,我們使用此查詢返回所有 Win32_USBController 類的執行個體:
Set colControllers = objWMIService.ExecQuery _
("Select * From Win32_USBController")
在此我們設定一個 For Each 迴圈來遍曆集合(集合當然是代表電腦上的所有 USB 連接埠)中的每一項。遺憾的是,Win32_USBController 類不包含可告訴我們 USB 版本的屬性(如 Version),實際上,並沒有明確的方法來查看 USB 插槽的屬性並瞭解它是 1.1 版本還是 2.0 版本。不過,大部分 2.0 連接埠均在名稱中的某個位置包含 Enhanced 一詞。我們不能保證所有連接埠均如此,這就是我們說此指令碼很可能返回電腦上 USB 2.0 連接埠數量的原因。但是,在辦公室裡的隨機測試中,此方法似乎行得通;發現 2.0 插槽時它總是有類似下面的名稱:
VIA USB Enhanced Host Controller
那麼,這對我們有何協助呢?嗯,這表示我們可以使用 InStr 函數來查看 Enhanced 一詞是否出現在每個插槽的 Name 中:
If Instr(objController.Name, "Enhanced") Then
如果 InStr 傳回值 True(從技術角度來說,如果它返回比 0 大的值),則表示在名稱中某處發現了 Enhanced 一詞。在這種情況下,我們會將 i 值加 1:
i = i + 1
如果 InStr 返回 0,表示找不到Enhanced 一詞怎麼辦?嗯,在這種情況下,我們就進入下一個迴圈並嘗試集合中的下一項,i 值保持不變。
我們繼續進行查詢,每次找到名稱中有 Enhanced 的 USB 插槽即增加 i 值。當全部完成後,我們只需回顯 i 值,它將告訴我們電腦上 USB 2.0 連接埠的數量。
它並不一定是萬無一失的方法,但好像還管用。而且,您知道,這和您為我們做事還不一樣。
哦,對了;我們忘記了一件事。嗯,您或許喜歡巧克力?