我想在方括号中列出所有以某些文本结尾的文件。
但是Get-ChildItem *[*
或Get-ChildItem *`[*
或Get-ChildItem *``[*
都不起作用。
如何不费吹灰之力地完成这项工作(即通过创建变量,通过管道运行其他命令等)
答案 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
)。-Filter
的效果要好于让PowerShell通过(暗示)[...]
或Filter
进行过滤。另一种选择是添加另一层转义,但这是不明智的,因为一旦修复了错误,它将停止工作:
-Path
[1]自Windows PowerShell v5.1 / PowerShell Core 6.2.0-preview.3