我正在努力编写一个执行以下操作的 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)
| 归档时间: |
|
| 查看次数: |
3248 次 |
| 最近记录: |