長時間動作するような PowerShell スクリプトを書く必要がある場合、終了時に音による通知がほしくなります。本記事では、PowerShell 標準の機能で利用できる 3 種類のアプローチをご紹介します。
ビープ音を鳴らす
まずは古式ゆかしいビープ音です。Console クラスの Beep メソッドを利用します。
# デフォルト設定でビープ音を鳴らす
[Console]::Beep()
# 指定の周波数、再生時間でビープ音鳴らす
[Console]::Beep(524, 1000)
WAV ファイルを再生する
せっかくなのでお好みの音楽で通知してほしい場合もあるでしょう。そんな時は SoundPlayer クラスを利用します。
# 同期的に再生
(New-Object Media.SoundPlayer <WAV ファイルへのパス>).PlaySync()
非同期的に再生・停止したい場合は SoundPlayer
クラスのインスタンスを変数に格納しておき、SoundPlayer#Stop()
で停止します。
# 非同期的に再生
$sp = New-Object Media.SoundPlayer <WAV ファイルへのパス>
$sp.Play()
# 停止
$sp.Stop()
TTS で日本語を喋らせる
ビープ音や音楽ファイルでなく、任意のメッセージを発話させる(Text-to-Speech)こともできます。PowerShell から簡単に呼び出せる TTS には 2 種類あります。
Microsoft Speech API 5.4 (COM) の ISpVoice::Speak:
(New-Object -ComObject SAPI.SpVoice).Speak("喋らせたい内容")
.NET Framework 3.0 - 4.8.1 の SpeechSynthesizer クラス:
# 同期的に再生
(New-Object System.Speech.Synthesis.SpeechSynthesizer).Speak("喋らせたい内容")
# 非同期的に再生
$ss = New-Object System.Speech.Synthesis.SpeechSynthesizer
$ss.SpeakAsync("looooooooooooooooooooooooooong text")
# 停止
$ss.SpeakAsyncCancelAll()