嗨,Scripting Guy!

嗨,Scripting Guy!

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

還有,別忘了瞧瞧全新經過改良的嗨,Scripting Guy!過往文件

今天的問題:如何向使用者顯示一個只能讓他們選取資料夾的對話方塊?


如何向使用者顯示一個只能讓他們選取資料夾的對話方塊?

嗨,Scripting Guy!在上一篇專欄中,您說明了如何顯示使用者一個可讓他們選取檔案的對話方塊。有沒有什麼方法可以向使用者顯示只能讓他們選取資料夾的對話方塊呢?

-- LP

LP,您好。您來對地方了,Scripting Guys 有醫生交代的處方。

實際上,我們有 BrowseForFolder 方法,這是 Windows Shell 物件的一部分。如果醫生開的是這類處方,您可能要好好慎重考慮一下聽聽另外一名醫生怎麼說。

雖說我們對於開出 BrowseForFolder 方法的醫生存有質疑,但是我們對自己開此一處方可是一點疑慮也沒有。讓我們先說明一個範例指令碼,再來解釋它的運作方式:

Const WINDOW_HANDLE = 0
Const OPTIONS = 0
Set objShell = CreateObject("Shell.Application")
Set objFolder = objShell.BrowseForFolder _
    (WINDOW_HANDLE, "Select a folder:", OPTIONS, "C:\") 
If objFolder Is Nothing Then
    Wscript.Quit
End If
Set objFolderItem = objFolder.Self
objPath = objFolderItem.Path
Wscript.Echo objPath

我們先是定義一組常數:WINDOW_HANDLE 和 OPTIONS。WINDOW_HANDLE 常數代表一個數字 ID,這個數字 ID 需要指派到我們要顯示的對話方塊,對於指令碼來說,這個值應該固定為 0。將 OPTIONS 設為 0 表示我們要顯示一個非常簡單的對話方塊,會限制使用者從資料夾清單中進行選取。或者,可以將 OPTIONS 設為 &H10&,這樣一來,我們的對話方塊就會包含一個文字區域,讓使用者鍵入資料夾路徑。

定義好常數之後,會建立 Shell.Application 物件的執行個體,接著使用此段程式碼來顯示瀏覽資料夾對話方塊。

Set objFolder = objShell.BrowseForFolder _
    (WINDOW_HANDLE, "Select a folder:", OPTIONS, "C:\")

如您所見,我們只呼叫了 BrowseForFolder 方法,傳遞四個參數:

  • WINDOW_HANDLE,這跟我們提到的一樣,是指派給對話方塊視窗的數字 ID。
  • 文字字串「Select a folder」(選取資料夾),它的作用是作為顯示在對話方塊中的指示性訊息。
  • OPTIONS,此為常數,代表建構對話方塊時所使用的選項。
  • C:\,它的用途是作為對話方塊的根資料夾。對話方塊會開啟在 C:\,而且不容許您選取任何比樹狀結構還高的檔案位置 (例如,您不能選取 [我的電腦])。如果將根資料夾設成 C:\Scripts,那麼使用者就只能選取 C:\Scripts 資料夾和其任一子資料夾。

該段程式碼會產生與這個出現在螢幕上的對話方塊:

[瀏覽資料夾] 對話方塊


(如果您還在猜測,沒錯,您看過這個對話方塊。許多 Windows 應用程式都利用相同的方法和相同的對話方塊)。

指令碼到目前為止會暫停,等候使用者選取資料夾,並按 [確定] 或按 [取消]。當使用者進行下列兩個動作之一時,就會關閉對話方塊,而且動作會存放在 objFolder 的物件參考中。

那我們要怎麼知道使用者到底是選取了資料夾,還是按了 [確定],或者只是按了 [取消] 呢?這正是此段程式碼的作用所在:

If objFolder Is Nothing Then
    Wscript.Quit
End If

此程式碼會檢查我們的物件參考 (objFolder),看看是否剛好等於實際的物件 (這是 Nothing 關鍵字的用途)。如果 objFolder 的確等於 Nothing,表示使用者按下了 [取消],這樣的話,就直接使用 Wscript.Quit 來結束指令碼。如果 objFolder 不等於 Nothing,那麼 objFolder 就必須參考實際物件,而指令碼會繼續它愉快的旅途。

因為 Shell 物件中的怪癖,必須加上接下來的兩行程式碼:

Set objFolderItem = objFolder.Self
objPath = objFolderItem.Path

當使用者選取資料夾並按下 [確定] 時,會得到 Shell Folder 物件的執行個體。不過,基於某種原因,您不能對 Shell Folder 物件進行任何動作,如果想要擷取選定資料夾的路徑,我們必須改用 FolderItem 物件 (原因何在?我們也不知道)。因此我們的第一行程式碼使用 Self 方法,傳回一個與 Folder 物件剛好一模一樣的 FolderItem 物件。程式碼的第二行接著會把 FolderItem 物件的 Path 存放到一個名為 objPath 的變數中。有點怪,但行得通。

最後回應選定資料夾的路徑,就大功告成了:

[瀏覽資料夾] 對話方塊


就像之前提過的,我們的範例對話方塊使用 C:\ 作為根資料夾,而且不讓您選取位在電腦上任何地方以外的資料夾。這有時候是件好事,可強迫使用者從特定的資料夾組選擇。可是有時候,您會希望給使用者機會選擇位在檔案系統上任何地方的資料夾。有這可能嗎?

絕對有。這一段修改過的指令碼我們就不詳述,不過這段指令碼會將 [我的電腦] 設為根資料夾:

Const MY_COMPUTER = &H11&
Const WINDOW_HANDLE = 0
Const OPTIONS = 0
Set objShell = CreateObject("Shell.Application")
Set objFolder = objShell.Namespace(MY_COMPUTER)
Set objFolderItem = objFolder.Self
strPath = objFolderItem.Path
Set objShell = CreateObject("Shell.Application")
Set objFolder = objShell.BrowseForFolder _
    (WINDOW_HANDLE, "Select a folder:", OPTIONS, strPath) 
      
If objFolder Is Nothing Then
    Wscript.Quit
End If
Set objFolderItem = objFolder.Self
objPath = objFolderItem.Path
Wscript.Echo objPath

跟您預期的一樣,所得到的對話方塊提供許多選項讓您選擇:

[瀏覽資料夾] 對話方塊


這不正就是您要的嘛,而且希望不是醫生交代的。


如需詳細資訊

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

 

回到頁首 回到頁首