如何在 PowerShell Get-ChildItem 的通配符模式中使用方括号?

AxD*_*AxD 3 powershell

我想列出所有以方括号中的文本结尾的文件。

但无论是Get-ChildItem *[*也没有Get-ChildItem *`[*,也没有Get-ChildItem *``[*工作。

我怎样才能毫不费力地完成这项工作(即通过创建变量,通过管道运行其他命令等)

mkl*_*nt0 6

以下包括您尝试过的一项操作,应该可以工作,但目前[1]由于错误而无法工作

# SHOULD work, but CURRENTLY BROKEN:
Get-ChildItem *``[*    # 1st ` is for string parsing, 2nd ` for wildcard escaping
Get-ChildItem "*``[*"  # ditto, with double quotes
Get-ChildItem '*`[*'   # single-quoted alternative, requires only 1 `
Run Code Online (Sandbox Code Playgroud)

请注意,(第一个)位置参数的使用隐式绑定到Get-ChildItem-Path参数。

目的是Get-ChildItem在参数解析后查看以下文字:*`[*,正确转义[with`以便将其视为文字。

顺便说一句: unquoted*`[*等价于 double-quoted "*`[*",这会导致 literal *[*,因为 PowerShell 的字符串解析会解释`并有效地将其删除。

解决方法

不是转义[字符,而是将其包含在[...],一个字符集表达式中,这会导致它按字面意思匹配:

Get-ChildItem *[[]*  # OK
Run Code Online (Sandbox Code Playgroud)

有趣的是,执行过滤通过-Include没有出现错误:

Get-ChildItem * -Include '*`[*'  # OK
Run Code Online (Sandbox Code Playgroud)

另一种选择是使用-Filter替代(隐含的)-Path,如证明Paxz的答案,但要注意-Filter的通配符的语言是一样的PowerShell的(以作为支持-Path-Include/-Exclude参数); 该-Filter参数传递给Windows API,它的通配符语言不同,如下所示:

  • 它支持较少的结构,特别是没有字符集或范围 ( [...])。
  • 它有遗留的怪癖 - 请参阅此答案
  • Filter好的方面来说,由于在源头进行过滤,使用比让 PowerShell 通过(隐含)-Path或进行过滤效果更好-Include

另一种选择是添加另一层转义,但这是不明智的,因为一旦错误修复它就会停止工作:

# NOT RECOMMENDED: will stop working once the bug is fixed.
Get-ChildItem '*``[*' 
Run Code Online (Sandbox Code Playgroud)

[1] 自 Windows PowerShell v5.1 / PowerShell Core 6.2.0-preview.3