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

时间:2019-01-08 14:51:34

标签: powershell

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

但是Get-ChildItem *[*Get-ChildItem *`[*Get-ChildItem *``[*都不起作用。

如何不费吹灰之力地完成这项工作(即通过创建变量,通过管道运行其他命令等)

2 个答案:

答案 0 :(得分:3)

您必须正确使用-Filter参数。 当您不指定参数时(如您在示例中所做的那样),它将假定您要使用第一个参数(在本例中为-Path,参考文献http://localhost:8080)。

尝试以下方法:

Get-ChildItem -Filter "*`[*"

这为我找到了文件ad.a[s]

您也可以将过滤器更改为此:

Get-ChildItem -Filter "*`[*`]"

将其展开为右括号。

答案 1 :(得分:3)

以下内容(包括您尝试过的其中一项内容)应该有效,但currently[1] doesn't work due to a bug

# 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 `

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

-Path的目的是让参数解析后看到以下文字:Get-ChildItem,它正确地用*`[*转义[以便将其视为文字。

顺便说一句:未引号`等同于双引号*`[*,其结果为文字"*`[*",因为PowerShell的字符串解析解释了{{ 1}},并有效地将其删除。

解决方法

与其转义*[*字符,不如将其括在字符集表达式`中,这会使它在字面上匹配:

[

有趣的是,通过[...]执行过滤不会出现错误:

Get-ChildItem *[[]*  # OK

另一种选择是使用-Include代替(暗示)Get-ChildItem * -Include '*`[*' # OK ,如Paxz's answer所示,但是请注意, -Filter的通配符语言是< em>不同于(与PowerShell的相同)(受-Path-Filter / -Path参数支持); -Include参数传递给Windows API,其通配符语言如下:

  • 它支持较少的构造,尤其是没有字符集或范围(-Exclude)。
  • 它具有遗留的古怪之处-参见this answer
  • 从正面来看,由于在源处进行了过滤,因此使用-Filter的效果要好于让PowerShell通过(暗示)[...]Filter进行过滤。

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

-Path

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