A small collection of cobbled together Powershell functions for GUI messages and user input.
Purpose and Background
I just needed a simple and easy way to display information, warnings, get input, select a file or directory, or ask a simple response question in a GUI format for my Powershell scripts. Sure there are many great modules I could use that are much more sophisticated, but I just found it fun to make my own and only needed some basic options. That's why I pieced together PSGUIFunction's examples for input and dialog boxes. Hopefully, you can get some use from them too.
The message boxes available are:
- Information
- Warning
- Error
- Question
- Yes/No
- Ok/Cancel
- Retry/Cancel
- Abort/Retry/Ignore
The input boxes available are:
- String/Integer Input Box (returns a string or integer if entered)
- Listbox Input (returns the selection(s) from a given array)
The dialog boxes available are:
- Select Filename (returns full path to file selected)
- Save As Filename (returns full path to file and name for saving)
- Select Directory (returns full path to directory selected)
Example Use
Copy and paste the function examples from within the PSGUIFunctions.ps1 file directly into your own script and call the function passing the required or optional arguments:
function Select-Folder { <# .SYNOPSIS Opens a folder selection dialog and returns full path to the folder. .EXAMPLE $selectedFolder = Select-Folder #> Add-Type -AssemblyName System.Windows.Forms $FolderSelect = New-Object System.Windows.Forms.FolderBrowserDialog $null = $FolderSelect.ShowDialog() $SelectedFolder = $FolderSelect.SelectedPath return $SelectedFolder } $selectedFolder = Select-Folder # Returns the full path to the selected folder assigning it to the $selectedFolder variable
Full Script
#Requires -Version 5 # Collection of cobbled together Powershell functions for GUI based message and user input prompts. function Select-Folder { <# .SYNOPSIS Opens a folder selection dialog and returns full path to the folder. .EXAMPLE $selectedFolder = Select-Folder #> Add-Type -AssemblyName System.Windows.Forms $FolderSelect = New-Object System.Windows.Forms.FolderBrowserDialog $null = $FolderSelect.ShowDialog() $SelectedFolder = $FolderSelect.SelectedPath return $SelectedFolder } function Select-File { <# .SYNOPSIS Opens a file selection dialog and returns full path to the file. .PARAMETER InitialDialogDir Specifies the inital directory to start in the dialog. If unspecified it defaults to the root of the home drive. .EXAMPLE $selectedFile = Select-File -InitialDialogDir "C:\Users\Public\Documents" #> param ( [Parameter(Mandatory=$false)] [String] $InitialDialogDir = "$env:HOMEDRIVE" ) Add-Type -AssemblyName System.Windows.Forms $FileSelect = New-Object System.Windows.Forms.OpenFileDialog -Property @{ InitialDirectory = $InitialDialogDir filter = "All files (*.*)| *.*" } $null = $FileSelect.ShowDialog() $SelectedFile = $FileSelect.FileName return $SelectedFile } function Save-File { <# .SYNOPSIS Creates a save file dialog and returns the path and name of the file to save. .PARAMETER InitialDialogDir Specifies the initial directory to start in the dialog. If unspecified it defaults to the root of the home drive. .EXAMPLE $saveFile = Save-File -InitialDialogDir "C:\Users\Public\Documents" #> param ( [Parameter(Mandatory=$false)] [String] $InitialDialogDir = "$env:HOMEDRIVE" ) Add-Type -AssemblyName System.Windows.Forms $FileSelect = New-Object System.Windows.Forms.SaveFileDialog -Property @{ InitialDirectory = $InitialDialogDir filter = "All files (*.*)| *.*" } $null = $FileSelect.ShowDialog() $SelectedFile = $FileSelect.FileName return $SelectedFile } function Show-MessageBox { <# .SYNOPSIS Displays a message box and returns the button pressed in response. .PARAMETER MessageText Specifies the main text of the message to display. .PARAMETER MessageTitle Specifies the title of the message box. .PARAMETER ButtonOptions Specifies the button types shown for response to the message box. Default is 'OKCancel'. .PARAMETER MessageBoxIcon Specifies the icon displayed on the message box to indicate it's type. Default is 'Information'. .PARAMETER MessageBoxDefaultButton Specifies the default button to be activated on the message box. Default is 'Button1'. .EXAMPLE $returnedMessageBoxButton = Show-MessageBox -MessageText "Hello, World" -MessageTitle "Hello World" #> param ( [Parameter(Mandatory=$true)] [String] $MessageText, [Parameter(Mandatory=$false)] [String] $MessageTitle = "Message", [Parameter(Mandatory=$false)] [String] $ButtonOptions = "OKCancel", # YesNoCancel, AbortRetryIgnore, YesNo, RetryCancel [Parameter(Mandatory=$false)] [String] $MessageBoxIcon = "Information", # Error, Question, Warning, Stop, Hand [Parameter(Mandatory=$false)] [String] $MessageBoxDefaultButton = "Button1" # Button2, Button3 ) Add-Type -AssemblyName System.Windows.Forms $ButtonReturn=[System.Windows.Forms.MessageBox]::Show("$MessageText","$MessageTitle", + [System.Windows.Forms.MessageBoxButtons]::$ButtonOptions,[System.Windows.Forms.MessageBoxIcon]::$MessageBoxIcon, + [System.Windows.Forms.MessageBoxDefaultButton]::$MessageBoxDefaultButton) return $ButtonReturn } function Get-UserInput { <# .SYNOPSIS Displays a user input box and returns the user's input as a string (default) or integer (see parameter). .PARAMETER InputMessage Specifies the main text of the input box message to display. .PARAMETER InputTitle Specifies the title of the input box. .PARAMETER DefaultInput Allows you to set an initial default input value for the user. .PARAMETER ReturnAsInteger Default is set to '$false'. Set to '$true' to convert input from string to integer (if conversion is possible). .EXAMPLE $userInput = Get-UserInput -InputMessage "What is your name?" -InputTitle "Your Information" $userInput = Get-UserInput -InputMessage "How old are you?" -ReturnAsInteger $true #> param ( [Parameter(Mandatory=$true)] [String] $InputMessage, [Parameter(Mandatory=$false)] [String] $InputTitle = "Input Request", [Parameter(Mandatory=$false)] [String] $DefaultInput, [Parameter(Mandatory=$false)] [bool] $ReturnAsInteger = $false # Set to "$true" if you want a numeric string converted to an integer ) [void][System.Reflection.Assembly]::LoadWithPartialName('Microsoft.VisualBasic') $UsersInput = [Microsoft.VisualBasic.Interaction]::InputBox($InputMessage, $InputTitle, $DefaultInput) if ($ReturnAsInteger -eq $true -and $UsersInput -match "^\d+$") { return [int]$UsersInput } else { return $UsersInput } } # Display Listbox Input Selection function Show-ListBox { <# .SYNOPSIS Displays a listbox and returns single or multiple choices from the list of items. (Uses Powershell's Out-GridView.) .PARAMETER ItemsForList List items must be passed in from a Powershell array. .PARAMETER ChoiceMode Allows you to set for 'Single' item only or 'Multiple' item selections by user. Default is 'Single'. Single items are returned as System.String type, multiple items are returned as a System.Object[] type. .PARAMETER BoxTitle Specifies the title of the list box and can be used to ask for selection. .PARAMETER SortListItems Allows you to specify if list item are sorted (e.g. alphabetically). Default is '$false'. .EXAMPLE $listItems = @('Jack','John','Jill','Jane') $userInput = Show-ListBox -ItemsForList $listItems -BoxTitle "Please choose a name:" -ChoiceMode "Single" -SortListItems $true #> param ( [Parameter(Mandatory=$true)] [array] $ItemsForList, # List items passed in as an array [Parameter(Mandatory=$false)] [String] $ChoiceMode = "Single", # "Single" (default) or "Multiple" item selection [Parameter(Mandatory=$false)] [String] $BoxTitle = "Choose item below and press OK:", [Parameter(Mandatory=$false)] [bool] $SortListItems = $false # Set to "$true" if you want to sort the list items alphanumerically ) if ($SortListItems) { $SelectedBoxItems = $ItemsForList | Sort-Object | Out-GridView -OutputMode $ChoiceMode -Title $BoxTitle } else { $SelectedBoxItems = $ItemsForList | Out-GridView -OutputMode $ChoiceMode -Title $BoxTitle } return $SelectedBoxItems }
License
MIT License for PSGUIFunctions