Powershell - Kombiniertes CMDLet für die Anzeige von Standard-Dateiauswahldialogen
Für alle die es in Ihrem Projekt gebrauchen können oder es noch nicht in Ihrer Funktionsbibliothek haben, eine Funktion welche die Anzeige der Standard-Dateisystemdialoge in einer einzigen Prozedur kombiniert mit dynamischen Parametern je nach Dialogtyp.
Viel Spaß damit
Grüße @colinardo
Folgende Dialoge lassen sich mit der Funktion anzeigen:
- FileOpenDialog (Datei öffnen Dialog)
- SaveFileDialog (Datei speichern Dialog)
- FolderBrowserDialog (Ordnerauswahl Dialog)
Powershell-CMDLet: Show-FileSystemDialog / min. PS Version 3.0
function Show-FileSystemDialog{
<#
.SYNOPSIS
Show Default Filesystem Dialogs
.DESCRIPTION
This Function combines all three Filesystem Dialogs (FolderBrowserDialog,FileOpenDialog,FileSaveDialog) in one function
.EXAMPLE
Show-FileSystemDialog -OpenFileDialog -InitialDirectory "C:\" -MultiSelect
.EXAMPLE
Show-FileSystemDialog -SaveFileDialog -Filter "CSV-Files|*.csv"
.EXAMPLE
Show-FileSystemDialog -FolderBrowserDialog -RootFolder Desktop
.PARAMETER DialogType
The type of the Dialog which is one of the following Constants: FolderBrowserDialog,FileOpenDialog,FileSaveDialog
.RETURNVALUE
- Returns absolute File- or Folder-Paths as [String] or [string[]] in case multiple files are selected
- Returns $False if user selects no file or path
.Notes
####### Dynamic Parameters #########
PARAMETER -InitialDirectory
The directory the dialog displays when opening (available for OpenFileDialog,SaveFileDialog)
PARAMETER -MultiSelect
Switch which enables selecting multiple files at once (available only for OpenFileDialog)
PARAMETER -FileFilter
The file filter which is applied to the dialog (available for OpenFileDialog,SaveFileDialog)
It must have the following format "[Filterdescription] | [extensions separated by ';']"
- example : "Images | *.png;*.jpg;*.bmp"
PARAMETER -RootFolder
The root of the FolderBrowser-Tree (available only for FolderBrowserDialog)
.LINK
created by @colinardo @Administrator.de / https://administrator.de/user/colinardo/
#>
[CmdletBinding()]
param(
[parameter(mandatory=$true)][ValidateSet("OpenFileDialog","SaveFileDialog","FolderBrowserDialog")][string]$DialogType
)
DynamicParam {
$attrCollection = new-object System.Collections.ObjectModel.Collection[System.Attribute]
$paramDic = new-object System.Management.Automation.RuntimeDefinedParameterDictionary
$attr = new-object System.Management.Automation.ParameterAttribute
switch($DialogType){
"OpenFileDialog"{
$attr.Mandatory = $false
$attrCollection.Add($attr)
$dynParam1 = new-object System.Management.Automation.RuntimeDefinedParameter("MultiSelect", [switch], $attrCollection)
$dynParam2 = new-object System.Management.Automation.RuntimeDefinedParameter("InitialDirectory", [string], $attrCollection)
$dynParam3 = new-object System.Management.Automation.RuntimeDefinedParameter("FileFilter", [string], $attrCollection)
$paramDic.Add("MultiSelect", $dynParam1)
$paramDic.Add("InitialDirectory", $dynParam2)
$paramDic.Add("FileFilter", $dynParam3)
return $paramDic
}
"SaveFileDialog"{
$attr.Mandatory = $false
$attrCollection.Add($attr)
$dynParam1 = new-object System.Management.Automation.RuntimeDefinedParameter("InitialDirectory", [string], $attrCollection)
$dynParam2 = new-object System.Management.Automation.RuntimeDefinedParameter("FileFilter", [string], $attrCollection)
$paramDic.Add("InitialDirectory", $dynParam1)
$paramDic.Add("FileFilter", $dynParam2)
return $paramDic
}
"FolderBrowserDialog"{
$attr.Mandatory = $false
$attrCollection.Add($attr)
$dynParam1 = new-object System.Management.Automation.RuntimeDefinedParameter("RootFolder", [System.Environment+SpecialFolder], $attrCollection)
$paramDic.Add("RootFolder", $dynParam1)
return $paramDic
}
}
}
begin{
[void][System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
if ($PSBoundParameters.FileFilter -and $PSBoundParameters.FileFilter -eq ""){$PSBoundParameters.FileFilter = "Alle Dateien|*.*"}
if ($PSBoundParameters.RootFolder -and $PSBoundParameters.RootFolder -eq $null){$PSBoundParameters.RootFolder = [System.Environment+SpecialFolder]::Desktop}
}
process{
switch ($DialogType){
"OpenFileDialog"{
$dlg = New-Object System.Windows.Forms.OpenFileDialog
if ($PSBoundParameters.MultiSelect.IsPresent){$dlg.Multiselect = $true}
if($PSBoundParameters.InitialDirectory){$dlg.InitialDirectory = $PSBoundParameters.InitialDirectory}
$dlg.Filter = $PSBoundParameters.FileFilter
if($dlg.ShowDialog() -eq 'OK'){
return $dlg.FileNames
}else{return $false}
}
"SaveFileDialog"{
$dlg = New-Object System.Windows.Forms.SaveFileDialog
if($PSBoundParameters.InitialDirectory){$dlg.InitialDirectory = $PSBoundParameters.InitialDirectory}
$dlg.Filter = $PSBoundParameters.FileFilter
if($dlg.ShowDialog() -eq 'OK'){
return $dlg.FileName
}else{return $false}
}
"FolderBrowserDialog"{
$dlg = New-Object System.Windows.Forms.FolderBrowserDialog
$dlg.ShowNewFolderButton = $true
$dlg.RootFolder = $PSBoundParameters.RootFolder
if($dlg.ShowDialog() -eq 'OK'){
return $dlg.SelectedPath
}else{return $false}
}
}
}
}
Anwendungsbeispiele
Datei öffnen Dialog mit Filter, Angabe des Startpfades und Mehrfachauswahl
Show-FileSystemDialog -DialogType FileOpenDialog -FileFilter "Textdateien|*.txt" -InitialDirectory "C:\Ordner" -MultiSelect
Datei speichern Dialog mit multiplen Filtern und Startpfad
Show-FileSystemDialog -DialogType SaveFileDialog -FileFilter "Excel-Files|*.xlsx;*.xlsm;*.xlst" -InitialDirectory "C:\Ordner"
Ordner-Browser Dialog mit Angabe des RootOrdners
Show-FileSystemDialog -DialogType FolderBrowserDialog -RootFolder MyComputer
Viel Spaß damit
Grüße @colinardo
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 268382
Url: https://administrator.de/knowledge/powershell-kombiniertes-cmdlet-fuer-die-anzeige-von-standard-dateiauswahldialogen-268382.html
Ausgedruckt am: 31.03.2025 um 22:03 Uhr