Give The Power of Speech and Sound to Your PowerShell Scripts
Do you ever have the problem where you start a long running script (such as running a code build), multi-task on something else on another monitor while waiting for the script to finish, and then totally forget about the script until half an hour later? Well, here’s a solution your problem: have your script give you holler at you when it’s done.

In my library script file, I have the following functions to play sound files and to speak any text:
function PlayMp3($path) {
# Use the default player to play. Hide the window.
$si = new-object System.Diagnostics.ProcessStartInfo
$si.fileName = $path
$si.windowStyle = [System.Diagnostics.ProcessWindowStyle]::Hidden
$process = New-Object System.Diagnostics.Process
$process.startInfo=$si
$process.start()
}
function PlayWav($path) {
$sound = new-Object System.Media.SoundPlayer;
$sound.SoundLocation="$path";
$sound.Play();
}
function Say($msg) {
$Voice = new-object -com SAPI.SpVoice
$Voice.Speak($msg, 1 )
}
If you like the text-to-speech feature but find Windows’ speech engine lacking, check out Ivona. It’s a commercial text-to-speech engine but you are allow to generate and download short speech files for free personal use. Now, my script can nicely interrupt me to tell me when it’s done. Other online text-to-speech engines: vozMe, SpokenText.
If Making Noise Is Not Your Thing
If making noise is not your thing, consider displaying a message in the Notification Area. Here’s the code (courtesy Microsoft TechNet):

function Get-ScriptName {
$MyInvocation.ScriptName
}
function DisplayNotificationInfo($msg, $title, $type) {
# $type - "info" or "error"
if ($type -eq $null) {$type = "info"}
if ($title -eq $null) {$title = Get-ScriptName}
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
$objNotifyIcon = New-Object System.Windows.Forms.NotifyIcon
# Specify your own icon below
$objNotifyIcon.Icon = "C:CdoScriptsFolder.ico"
$objNotifyIcon.BalloonTipIcon = "Info"
$objNotifyIcon.BalloonTipTitle = $title
$objNotifyIcon.BalloonTipText = $msg
$objNotifyIcon.Visible = $True
$objNotifyIcon.ShowBalloonTip(10000)
}