Centrum skryptów - Systemy operacyjne

Jak odtworzyć dźwięk za pomocą skryptu?

Udostępnij na: Facebook

Skrypciarze odpowiadają na Wasze pytania

Cześć Skrypciarze!

Witamy w rubryce TechNet, w której Skrypciarze z firmy Microsoft odpowiadają na częste pytania dotyczące używania skryptów w administracji systemu. Jeśli macie jakieś pytania z tej dziedziny, zachęcamy do wysłania e-maila na adres: scripter@microsoft.com. Nie możemy zagwarantować odpowiedzi na każde otrzymane pytanie, ale staramy się jak możemy.

Jak odtworzyć dźwięk za pomocą skryptu?

Cześć Skrypciarze! Pytanie

Cześć, Skrypciarze! Mam skrypt, wyświetlający okno komunikatu informujące użytkownika o problemie. Czy można sprawić, aby z wyświetleniem tego okna skojarzone było odtwarzanie dźwięku?

-- TL

Cześć Skrypciarze! Odpowiedź

Cześć, TL. Nie wiem, czy robicie to umyślnie, czy tak musi być, ale macie tendencję do zadawania pytań, na które nie ma jasnej odpowiedzi. To kolejny taki przypadek: można przeczytać całą dokumentację VBScript i WSH po siedem razy i nie znaleźć żadnej metody pozwalającej bezpośrednio odtworzyć dźwięk za pomocą skryptu.

Dlatego też w celu odtworzenia dźwięku trzeba wywołać inny program. Jeśli plik dźwiękowy jest w formacie .WAV, najlepiej Rejestratora dźwięku systemu Windows. Przemawiają za tym co najmniej dwa argumenty. Po pierwsze, Rejestrator to mały program, który szybko się załaduje; Media Player ma dużo większe możliwości, ale użycie go do odtworzenia jednego, krótkiego dźwięku to coś jak armata na wróble. Po drugie, podając odpowiednie parametry wiersza polecenia, można uruchomić Rejestrator bez wyświetlania go na ekranie; użytkownik usłyszy odtwarzany dźwięk, ale nie zobaczy okna programu.

Oto skrypt, który odtworzy plik Notify.wav, standardowy dźwięk systemowy, znajdujący się w folderze 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

Dwa pierwsze wiersze skryptu są całkiem proste. W pierwszym z nich przypisujemy ścieżkę pliku do zmiennej strSoundFile; w drugim natomiast tworzymy wystąpienie obiektu Shell Wscript, którego użyjemy do uruchomienia Rejestratora.

W trzecim wierszu zaczynają się schody. Aby uruchomić Rejestrator z wiersza polecenia, potrzebujemy użyć następującego kodu:

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

Dwa pierwsze parametry instruują Rejestrator, że należy odtworzyć plik i zakończyć działanie; trzeci parametr to rzecz jasna nazwa pliku. W naszym przykładzie nie musimy ujmować ścieżki w podwójny cudzysłów – byłoby to konieczne, gdyby zawierała ona spacje. Ponieważ przykład być może posłuży Wam jako szablon, i tak ujęliśmy ścieżkę w cudzysłów. W ten sposób można podać np. taką ścieżkę:

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

Do ujęcia ścieżki pliku w podwójny cudzysłów używamy polecenia Chr(34), które – uwaga – wstawia w ciąg znaków podwójny cudzysłów. Stąd się wziął nasz wiersz kodu użyty w skrypcie, w którym mamy fragment sndrec32 /play /close, podwójny cudzysłów ("), ścieżkę pliku C:\Windows\Media\Notify.wav i kolejny podwójny cudzysłów ("):

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

I wreszcie w czwartym wierszu używamy metody Run, podając jej utworzony przed chwilą ciąg polecenia. Parametr 0 sprawia, że Rejestrator uruchomi się w oknie ukrytym; parametr True instruuje skrypt, by przed wznowieniem zaczekać, aż zakończy się odtwarzanie dźwięku.

Jeśli zaś chodzi o synchronizację odtwarzania dźwięku z wyświetleniem okna komunikatu, to jest to niemal niemożliwe. Uruchomienie Rejestratora zajmuje zawsze sekundę albo dwie. Można podczas wywoływania Rejestratora użyć parametru False; spowoduje to, że skrypt wznowi działanie natychmiast po uruchomieniu Rejestratora, bez czekania na zakończenie odtwarzania dźwięku.

Można także użyć polecenia Wscript.Sleep, które spauzuje na chwilę działanie skryptu. Da to czas na załadowanie Rejestratora, co przy odrobinie szczęścia spowoduje, że dźwięk będzie odtwarzany mniej-więcej jednocześnie z wyświetleniem okna. Prawdopodobnie nie będzie to dokładnie ten sam moment, ale prawie.

Oto przykładowy skrypt, który odtwarza dźwięk i mniej-więcej w tym samym czasie wyświetla okno komunikatu:

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."
 Do początku strony Do początku strony

 


Centrum skryptów - Systemy operacyjne