我想列出所有以方括号中的文本结尾的文件。
但无论是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 次 |
最近记录: |