Scripting Guy 為您解答問題

Hey, Scripting Guy!

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

資源

如何只有在磁碟機 X 並非使用中的情況下,才對應電腦上的磁碟機 X?

Hey, Scripting Guy! Question

嗨,Scripting Guy!如何只有在磁碟機 X 並非使用中的情況下,才對應電腦上的磁碟機 X?

        -- PN

Hey, Scripting Guy! Answer

PN,您好。您知道嗎?有一則令人難以置信的消息 (但是,很遺憾,這真的)。撰寫本專欄的 Scripting Guy 正忙於撰寫本專欄。因為今天剛好是 13 號星期五 ,所以您可能會想,今天的討論題目就是 13 號星期五

在一般的《嗨,Scripting Guy!》風格下,他一開始會稍微陳述一下星期五和 13 號的歷史。例如,在印度和挪威文化中,邀請 13 個人吃晚餐不太吉利 (尤其如果您剛好是掌廚的人)。在中世紀時代,13 被認為是不好的數字,因為據說女巫會以 13 個人為團體進行聚會:12 個女巫加上一個惡魔。

請注意:Scripting Editor 告訴我們這太荒謬了。畢竟,她的女巫集會很少有 13 個人參加。

同樣地,人們一直以帶有偏見的看法看待星期五。例如,傳說亞當和夏娃第一次偷嘗禁果就是發生在星期五。不用說,他們兩個也沒什麼好下場。在古羅馬時代,星期五是處決日。顯然這種做法很普遍,因為英國也採用這個想法,並將每個星期五都變成絞刑日。

在 Microsoft 裡,我們以同樣不吉利的方式沿襲了這項傳統:星期五是小組會議的常見日子。

無論如何,撰寫本專欄的 Scripting Guy 繼續陳述星期五 (一週裡面最糟的一天) 最後無可避免地與最不吉利的數字 13 結合。結果呢?13 號星期五就是那個一定會發生恐怖事件的日子。當時,撰寫本專欄的 Scripting Guy 正要將這些傳說斥為無稽之談,但卻發生了一件事:他的螢幕變黑、電腦自己重新開機,然後重新開機之後,顯示了下列訊息:

Script Center
Non-system or disk error.

糟糕...

不論您是否相信,但是在撰寫專欄 (揭穿 13 號星期五 不吉利的假面具) 時,我們的電腦壞了。如果壞的不是我們的電腦,我們可能會認為這事還滿有趣的 (Scripting Ed itor 就覺得這還滿有趣的)。

請注意:不,我們也不相信這是因果報應。不過,我們也不會這麼斬釘截鐵,以免這真的是因果報應。在淌入因果報應的混水之前,我們今天就已經有夠多的麻煩了。

那麼,我們是否仍然認為這個有關 13 號星期五 不吉利的看法只是無稽之談呢?當然。畢竟,雖然 13 號星期五對於我們而言可能沒有特別吉利 (至少對我們的電腦是如此),但是其實對於 PN 而言則相當吉利:

strComputer = "."

Set objWMIService=GetObject("winmgmts:\\" & strComputer & "\root\cimv2")

Set colItems = objWMIService.ExecQuery _
    ("Select * From Win32_LogicalDisk Where DeviceID = 'X:'")

If colItems.Count = 0 Then
    Set objNetwork = CreateObject("Wscript.Network")
    objNetwork.MapNetworkDrive "X:", "\\atl-fs-01\public"
End If

如您所見,這是一小段蠻容易撰寫的指令碼 (這樣算不錯了,因為我們沒有電腦可用來撰寫指令碼)。就如同平常的做法,我們一開始要連線到本機電腦上的 WMI 服務。我們是否能在遠端電腦上執行相同的指令碼呢?或許可以。要判斷遠端電腦上的磁碟機 X 是否使用中相當簡單。但很不幸的,要對應遠端電腦上的磁碟機就有點困難了。這是因為 Windows Script Host 和 WSH Network 物件都設計成在本機執行而非遠端執行 (沒錯,名為 Network 物件的東西卻無法透過網路運作,很有趣吧)。從另一方面來講,您一定可以找到這些事情的解決方法。如需建議,請參閱之前的《 嗨,Scripting Guy! 》專欄 (英文)

完成連線之後,我們接著要使用 ExecQuery 方法和下面這行程式碼,傳回電腦上 DeviceID 等於 X 之所有磁碟機的集合:

Set colItems = objWMIService.ExecQuery _
    ("Select * From Win32_LogicalDisk Where DeviceID = 'X:'")

為什麼要這麼做?其實,這是一種快速且方便判斷磁碟機 X 是否使用中的方式。如果磁碟機 X 已經對應 (至實體磁碟機或網路磁碟機),那麼集合中就會出現一個項目。如果磁碟機 X 並非使用中 (表示我們可以使用此磁碟機代號),那麼集合中就不會出現任何項目。

知道這一點之後,下一個步驟就是檢查集合 Count,以便判斷是否有任何磁碟機 X 使用中:

If colItems.Count = 0 Then

如果 Count 等於 0,就表示磁碟機 X 可以使用。因此,我們要繼續建立 Wscript.Network 物件的執行個體,然後使用 MapNetworkDrive 方法,將資料夾 \\atl-fs-01\public 對應至磁碟機 X:

Set objNetwork = CreateObject("Wscript.Network")
objNetwork.MapNetworkDrive "X:", "\\atl-fs-01\public"

如果 Count 並非等於 0 該怎麼辦?那麼,這只代表一件事:磁碟機 X 必定已經使用中。因此,根據 PN 的需求,我們不會進行任何動作。

請注意:如果磁碟機 X 使用中,繼續將磁碟機對應至下一個可用的磁碟機代號會不會比較好?可能會。如果您想要這樣做,那麼您也很幸運:我們剛好有另一個關於磁碟機對應的專欄 (英文),這則專欄的內容會說明如何判斷電腦上的下一個可用磁碟機代號。

無論如何,希望這有所幫助,PN。就像我們所說的,別太擔心 13 號星期五了;Scripting Guy 不認為 13 號星期五會比任何其他星期五更糟。畢竟,只要是星期五 (不論是不是 13 號),就表示我們必須工作。這點就完全排除了今天是幸運日的可能,不論我們的電腦是否壞掉都一樣。