我正在努力编写一个执行以下操作的 Powershell 命令。假设有一个文件夹,其中包含一堆随机名称匹配正则表达式模式的文件。我想捕获与模式匹配的部分并将文件重命名为该部分。
例如,如果模式是\w\d+\w+\d+
(或类似的),“asdjlk-c12aa13-.pdf”应该变成“c12aa13.pdf” 。
我目前的想法是这样的:
Get-ChildItem | Rename-Item -NewName { $_.Name -match $pattern ... } -WhatIf
where...
需要替换为将代码块的“值”(即 NewName)设置为匹配组的内容。即我不知道如何$matched
在-match
命令后直接访问。
另外,我想知道是否可以使用-match
,进行延迟匹配,.*?
这似乎不起作用。
虽然您可以-match
通过自动$Matches
变量跟踪操作并随后提取匹配的部分,但在操作员的帮助下将这两个操作组合起来通常更容易-replace
:
你只需要确保的是,为了只返回感兴趣的部分,则必须输入字符串匹配完全不关心的部分,然后忽略:
PS> 'asdjlk-c12aa13-.pdf' -replace '^.*?(\w\d+\w+\d+).*?(\.pdf)$', '$1$2'
c12aa13.pdf
Run Code Online (Sandbox Code Playgroud)
^.*?
(懒惰地)匹配感兴趣部分之前的前缀。
(\w\d+\w+\d+)
匹配感兴趣的部分,包裹在一个捕获组中;由于它是正则表达式中的第一个捕获组,您可以参考它$1
在替换操作数中捕获的内容。
.*?
(懒惰地)匹配.pdf
文件扩展名之后的所有内容。
(\.pdf)$
匹配.pdf
名称末尾的文件扩展名,作为第二个捕获组,可以$2
在替换操作数中引用。
$1$2
简单地连接 2 个捕获组匹配以输出所需的名称。
注意:通常,对正则表达式和替换操作数都使用单引号字符串,这样$
就不会被PowerShell事先意外解释。
有关-replace
替换操作数的更多信息和语法,请参阅我的这个答案。
您的命令上下文中的解决方案:
Get-ChildItem |
Rename-Item -NewName { $_.Name -replace '^.*?(\w\d+\w+\d+).*?(\.pdf)$', '$1$2' } -WhatIf
Run Code Online (Sandbox Code Playgroud)