嗨,Scripting Guy!

Hey,Scripting Guy!

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

今天的問題:我要如何從指令碼播放音效?


我要如何從指令碼播放音效?

嗨,Scripting Guy!我有一個指令碼會顯示訊息方塊,警告使用者有問題發生。有什麼方法可以在出現訊息方塊的同時播放音效嗎?

-- TL

TL,您好。你們是故意這樣問的,對不對?只要答案不夠明確,你們總愛不斷地發問。還有一個情況是:您在 VBScript 和 WSH 文件中東找西找,但就是找不到方法可以直接從指令碼播放音效,連一點線索都沒有,這時候可能連發出嗶嗶聲都有問題。

因此,您必須呼叫其他公用程式才能播放音效。只是音效要是 .WAV 格式,最好的辦法是使用 Windows「錄音機」。至少有兩個理由支持這點:第一,「錄音機」是輕量型的程式,理所當然地可以快速載入;而「媒體播放機」的功能則強的多,若只是播放嗶嗶聲可能有些大材小用。另外,只要藉由傳遞適當的命令列參數,就可以在背景執行「錄音機」,因此,您 (或使用者) 只會聽到聲音而不會看到「錄音機」顯示在螢幕上。

以下是會播放 Notify.wav 的指令碼,您可於 Windows\Media 資料夾中找到這個標準的作業系統音效。

strSoundFile = "C:\Windows\Media\Notify.wav"
Set objShell = CreateObject("Wscript.Shell")
strCommand = "sndrec32 /play /close " & chr(34) & strSoundFile & chr(34)
objShell.Run strCommand, 0, True

指令碼的前兩行非常簡單。第一行只是將檔案路徑指派給變數 strSoundFile,第二行則建立 Wscript Shell 物件的執行個體,物件是用來實際執行「錄音機」的。

第三行就比較有技巧,為了從命令提示字元執行「錄音機」,需要輸入這個命令:

sndrec32 /play /close "C:\Windows\Media\Windows XP Error.wav"

前兩個命令列參數會告知「錄音機」先播放檔案並自行終止,第三個參數當然就是要播放的檔案名稱。這個範例中,並不需要以雙引號括住檔案路徑,只有在路徑名稱包含空格時才需要雙引號。我們先使用雙引號括住檔案路徑以供您做為範本,當您播放的音效檔路徑名稱中確實有空格時就可加以使用。因此:

sndrec32 /play /close "C:\Windows\Media\Notify.wav"

為了要使用雙引號括住檔案路徑,我們使用會在字串中插入雙引號的 Chr(34) 指令。因此這行程式碼,會將 sndrec32 /play /close、雙引號標記 (")、檔案 C:\Windows\Media\Notify.wav 以及另一個雙引號標記 (") 連接起來:

strCommand = "sndrec32 /play /close " & chr(34) & strSoundFile & chr(34)

最後,第四行使用 Run 方法,傳遞剛剛建構的指令字串。參數 0 會讓「錄音機」以隱藏的視窗執行,True 告知指令碼先等候音效播放完畢再繼續後續的動作。

至於要讓訊息方塊在出現的同時播放聲音,您會發現其實很難做到,因為要載入「錄音機」並開始播放需要一到兩秒的時間。最好的辦法是進行兩件工作:第一,呼叫「錄音機」時使用 False 參數,這會告知指令碼啟動錄音機並繼續進行後續動作,而不需要等候音效播放完畢。

第二,使用 Wscript.Sleep 指令讓指令碼暫停大約一秒,這會讓「錄音機」有時間載入,幸運的話,音效將會在訊息方塊出現的時間開始播放。音效會「剛好」在訊息方塊出現的同時播放嗎?可能不會,但至少很接近了。

以下範例指令碼可以「大約」在彈出訊息方塊的同時播放音效:

strSoundFile = "C:\windows\Media\Notify.wav"
Set objShell = CreateObject("Wscript.Shell")
strCommand = "sndrec32 /play /close " & chr(34) & strSoundFile & chr(34)
objShell.Run strCommand, 0, False
Wscript.Sleep 1000
Msgbox "A problem has occurred."

如需詳細資訊

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

 

回到頁首 回到頁首