public/DsForms.ps1

function Get-DsFileOpenDialog {
    <#
    .SYNOPSIS
    .DESCRIPTION
    .PARAMETER InitialDirectory
    .PARAMETER Filter
    Optional. File type filter, using paired format as follows:
    "Text Files (*.txt)|*.txt"
    .PARAMETER Title
    Optional. Dialog form caption. Default is "Select Files"
    .PARAMETER MultiSelect
    Optional. Allows selecting multiple files. Default is single selection only.
    .EXAMPLE
    $files = Get-DsFileOpenDialog -InitialDirectory "c:\projects" -Filter "Python Files (*.py)|*.py" -Title "Select Files" -MultiSelect
    #>

    [CmdletBinding()]
    param (
        [parameter()][string]$InitialDirectory = "",
        [parameter()][string]$Filter = "All Files (*.*)|*.*",
        [parameter()][string]$Title = 'Select File',
        [parameter()][switch]$MultiSelect
    )
    #$Filter = 'Documents (*.docx)|*.docx|SpreadSheet (*.xlsx)|*.xlsx'
    [void] [System.Reflection.Assembly]::LoadWithPartialName('System.Windows.Forms')
    $OpenFileDialog = New-Object System.Windows.Forms.OpenFileDialog
    if ($initialDirectory) { $OpenFileDialog.initialDirectory = $initialDirectory }
    $OpenFileDialog.Filter = $Filter
    $OpenFileDialog.Title = $Title
    $OpenFileDialog.CheckFileExists = $True
    if ($MultiSelect) { $OpenFileDialog.MultiSelect = $True }
    Write-Host -ForegroundColor Yellow "* * * W A R N I N G : Dialog form may be hidden behind another window * * *"
    Write-Host
    [void] $OpenFileDialog.ShowDialog()
    if ($MultiSelect) {
        $selected = @($OpenFileDialog.FileNames)
    } else {
        $selected = $OpenFileDialog.FileName
    }
    $OpenFileDialog.Dispose()
    return $selected
}

function Get-DsFolderDialog {
    <#
    .SYNOPSIS
    Display a Folder selection dialog
    .DESCRIPTION
    Display a folder selection dialog to choose a target folder
    .PARAMETER InitialDirectory
    Optional. If empty, will default to the current default working directory
    .EXAMPLE
    $folder = Get-DsFolderDialog -InitialDirectory "c:\projects"
    #>

    param (
        [parameter()][string]$InitialDirectory = ""
    )
    [void] [System.Reflection.Assembly]::LoadWithPartialName('System.Windows.Forms')
    $FolderBrowserDialog = New-Object System.Windows.Forms.FolderBrowserDialog
    $FolderBrowserDialog.RootFolder = 'MyComputer'
    if (![string]::IsNullOrWhiteSpace($initialDirectory)) {
        $FolderBrowserDialog.SelectedPath = $initialDirectory
    }
    Write-Host -ForegroundColor Yellow "* * * W A R N I N G : Dialog form may be hidden behind another window * * *"
    Write-Host
    [void] $FolderBrowserDialog.ShowDialog()
    $selected = $FolderBrowserDialog.SelectedPath
    $FolderBrowserDialog.Dispose()
    return $selected
}

function Invoke-DsMsgBox {
    [CmdletBinding()]
    param (
        [parameter(Mandatory)][string]$Message,
        [parameter(Mandatory)][string]$Title,
        [parameter()][string][ValidateSet('Ok','OkCancel','YesNo','YesNoCancel')]$ButtonType = 'Ok',
        [parameter()][string]
            [ValidateSet('Asterisk','Error','Exclamation','Hand','Information','Question','Stop','Warning','None')]$Icon = 'Information'
    )
    Add-Type -AssemblyName PresentationCore, PresentationFramework
    $result = [System.Windows.MessageBox]::Show($Message, $Title, $ButtonType, $Icon)
    $result
}

function Invoke-DsFileSaveDialog {
    <#
    .SYNOPSIS
    Display a file Save or SaveAs dialog
    .DESCRIPTION
    Same as the synopsis
    .PARAMETER InitialDirectory
    .PARAMETER Filter
    .PARAMETER Title
    .EXAMPLE
    $filepath = Invoke-DsFileSaveDialog
    #>

    [CmdletBinding()]
    param (
        [parameter()][string]$InitialDirectory = "",
        [parameter()][string]$Filter = "All Files (*.*)|*.*",
        [parameter()][string]$Title = 'Save File'
    )
    #$Filter = 'Documents (*.docx)|*.docx|SpreadSheet (*.xlsx)|*.xlsx'
    [void] [System.Reflection.Assembly]::LoadWithPartialName('System.Windows.Forms')
    $FileSaveDialog = New-Object System.Windows.Forms.SaveFileDialog
    if (![string]::IsNullOrWhiteSpace($InitialDirectory)) { $FileSaveDialog.InitialDirectory = $InitialDirectory }
    $FileSaveDialog.Filter = $Filter
    $FileSaveDialog.Title = $Title
    $FileSaveDialog.CheckPathExists = $true
    if ($FileSaveDialog.ShowDialog() -eq 'Ok') {
        $selected = $FileSaveDialog.FileName
    }
    $FileSaveDialog.Dispose()
    return $selected
}

New-Alias -Name "Show-MessageBox" -Value Invoke-DsMsgBox
New-Alias -Name "MsgBox" -Value Invoke-DsMsgBox
New-Alias -Name "Invoke-OpenFileDialog" -Value Get-DsFileOpenDialog
New-Alias -Name "Invoke-FolderDialog" -Value Invoke-FolderDialog
New-Alias -Name "Invoke-SaveFileDialog" -Value Invoke-DsFileSaveDialog