PowerShell中FileOpenDialog多行过滤器失效问题求助
解决PowerShell OpenFileDialog过滤器分行编写失效问题
你的问题出在反引号换行时引入了多余空格,导致过滤器格式被破坏。完全可以分行编写过滤器,只要保证字符串格式符合显示名|扩展名|显示名|扩展名...的规则,没有多余空格。
错误原因
你当前的写法里,反引号后面有空格,且换行后行首的缩进空格被包含进了Filter字符串,最终生成的内容会带有多余空格,比如*.xlsx |Document...。这些空格会被系统当成过滤器规则的一部分,导致系统无法正确识别扩展名,自然找不到对应文件。
正确的分行写法
方法1:反引号严格换行(无多余空格)
反引号后面必须紧跟换行,不能有任何字符(包括空格),下一行内容顶格写:
$FileBrowser.Filter = 'SpreadSheet (*.xlsx)|*.xlsx` |Document (*.docx)|*.docx` |CSV (*.csv)|*.csv` |All Files (*.*)|*.*'
方法2:字符串拼接(更易读推荐)
把每个过滤器片段拆成单独字符串,用+拼接或利用PowerShell隐式拼接(每行一个字符串),完全避免空格问题:
$FileBrowser.Filter = 'SpreadSheet (*.xlsx)|*.xlsx' + '|Document (*.docx)|*.docx' + '|CSV (*.csv)|*.csv' + '|All Files (*.*)|*.*'
或者隐式拼接(无需+):
$FileBrowser.Filter = 'SpreadSheet (*.xlsx)|*.xlsx' '|Document (*.docx)|*.docx' '|CSV (*.csv)|*.csv' '|All Files (*.*)|*.*'
修改后的完整函数
function Open-FileDialog { [cmdletBinding()] param( [Parameter()] [ValidateScript({Test-Path $_})] [String] $InitialDirectory ) Add-Type -AssemblyName System.Windows.Forms $FileBrowser = New-Object System.Windows.Forms.OpenFileDialog if($InitialDirectory){ $FileBrowser.InitialDirectory = $InitialDirectory } else{ $FileBrowser.InitialDirectory = [Environment]::GetFolderPath('MyDocuments') } # 使用字符串拼接分行编写过滤器 $FileBrowser.Filter = 'SpreadSheet (*.xlsx)|*.xlsx' + '|Document (*.docx)|*.docx' + '|CSV (*.csv)|*.csv' + '|All Files (*.*)|*.*' [void]$FileBrowser.ShowDialog() $FileBrowser.FileName } $file = Open-FileDialog Invoke-Item $file
内容的提问来源于stack exchange,提问作者Matt Williamson
相关产品推荐
相关产品推荐

