我想列出所有以方括号中的文本结尾的文件。
但无论是Get-ChildItem *[*也没有Get-ChildItem *`[*,也没有Get-ChildItem *``[*工作。
我怎样才能毫不费力地完成这项工作(即通过创建变量,通过管道运行其他命令等)
以下包括您尝试过的一项操作,应该可以工作,但目前[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
| 归档时间: |
|
| 查看次数: |
833 次 |
| 最近记录: |