Functions/New-Popup.ps1
function New-PopUp { <# .SYNOPSIS New-Popup will display a popup message .DESCRIPTION The New-Popup command uses the Wscript.Shell PopUp method to display a graphical message box. You can customize its appearance of icons and buttons. By default the user must click a button to dismiss but you can set a timeout value in seconds to automatically dismiss the popup. The command will write the return value of the clicked button to the pipeline: OK = 1 Cancel = 2 Abort = 3 Retry = 4 Ignore = 5 Yes = 6 No = 7 If no button is clicked, the return value is -1. .PARAMETER Message The message you want displayed .PARAMETER Title The text to appear in title bar of dialog box .PARAMETER Time The time to display the message. Defaults to 0 (zero) which will keep dialog open until a button is clicked .PARAMETER Buttons Valid values for -Buttons include: "OK" "OKCancel" "AbortRetryIgnore" "YesNo" "YesNoCancel" "RetryCancel" .PARAMETER Icon Valid values for -Icon include: "Stop" "Question" "Exclamation" "Information" "None" .PARAMETER ShowOnTop Switch which will force the popup window to appear on top of all other windows. .PARAMETER AsString Will return a human readable representation of which button was pressed as opposed to an integer value. .EXAMPLE new-popup -message "The update script has completed" -title "Finished" -time 5 This will display a popup message using the default OK button and default Information icon. The popup will automatically dismiss after 5 seconds. .EXAMPLE $answer = new-popup -Message "Please pick" -Title "form" -buttons "OKCancel" -icon "information" If the user clicks "OK" the $answer variable will be equal to 1. If the user clicks "Cancel" the $answer variable will be equal to 2. .EXAMPLE $answer = new-popup -Message "Please pick" -Title "form" -buttons "OKCancel" -icon "information" -AsString If the user clicks "OK" the $answer variable will be equal to 'OK'. If the user clicks "Cancel" the $answer variable will be 'Cancel' .OUTPUTS An integer with the following value depending upon the button pushed. Timeout = -1 # Value when timer finishes countdown. OK = 1 Cancel = 2 Abort = 3 Retry = 4 Ignore = 5 Yes = 6 No = 7 .LINK Wscript.Shell #> #region Parameters [CmdletBinding()] [OutputType('int')] [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseShouldProcessForStateChangingFunctions','')] Param ( [Parameter(Position=0,Mandatory,HelpMessage='Enter a message for the popup')] [ValidateNotNullorEmpty()] [string] $Message, [Parameter(Position=1,Mandatory,HelpMessage='Enter a title for the popup')] [ValidateNotNullorEmpty()] [string] $Title, [Parameter(Position=2)] [ValidateScript({$_ -ge 0})] [int] $Time=0, [Parameter(Position=3)] [ValidateNotNullorEmpty()] [ValidateSet('OK','OKCancel','AbortRetryIgnore','YesNo','YesNoCancel','RetryCancel')] [string] $Buttons='OK', [Parameter(Position=4)] [ValidateNotNullorEmpty()] [ValidateSet('Stop','Question','Exclamation','Information','None' )] [string] $Icon='None', [Parameter(Position=5)] [switch] $ShowOnTop, [Parameter(Position=6)] [switch] $AsString ) #endregion Parameters begin { Write-Verbose -Message "Starting [$($MyInvocation.Mycommand)]" } process { # set $ShowOnTopValue based on switch if ($ShowOnTop) { $ShowOnTopValue = 4096 } else { $ShowOnTopValue = 0 } #lookup key to convert buttons to their integer equivalents $ButtonsKey = @{ 'OK' = 0 'OKCancel' = 1 'AbortRetryIgnore' = 2 'YesNo' = 4 'YesNoCancel' = 3 'RetryCancel' = 5 } #lookup key to convert icon to their integer equivalents $IconKey = @{ 'Stop' = 16 'Question' = 32 'Exclamation' = 48 'Information' = 64 'None' = 0 } #lookup key to convert return value to human readable button press $ReturnKey = @{ -1 = 'Timeout' 1 = 'OK' 2 = 'Cancel' 3 = 'Abort' 4 = 'Retry' 5 = 'Ignore' 6 = 'Yes' 7 = 'No' } #create the COM Object try { $wshell = New-Object -ComObject Wscript.Shell -ErrorAction Stop #Button and icon type values are added together to create an integer value $return = $wshell.Popup($Message,$Time,$Title,$ButtonsKey[$Buttons] + $Iconkey[$Icon] + $ShowOnTopValue) if ($return -eq -1) { Write-Verbose -Message "User timedout [$($returnkey[$return])] after [$time] seconds" } else { Write-Verbose -Message "User pressed [$($returnkey[$return])]" } if ($AsString) { $ReturnKey[$return] } else { $return } } catch { #You should never really run into an exception in normal usage Write-Warning -Message 'Failed to create Wscript.Shell COM object' Write-Warning -Message ($_.exception.message) } } end { Write-Verbose -Message "Ending [$($MyInvocation.Mycommand)]" } } # EndFunction New-PopUp |