如何在批量重命名中使用正则表达式匹配组?

时间:2016-04-26 15:42:57

标签: regex powershell-v2.0 file-rename batch-rename

我尝试使用PowerShell进行基于正则表达式的批量重命名。

这成功地只给了我需要的文件:

Get-ChildItem . | Where-Object { $_.Name -cmatch "(\b|_)(L|H|M|X{1,3})(_|\b)" }

(所有那些包含大写L,M,X,......)

接下来,我想重命名,即mycustom_M.pngprocessed_M.pnganother_L.pngprocessed_L.png,依此类推。

基本上,我会使用正则表达式.*?(?:\b|_)(L|H|M|X{1,3})(?:_|\b).*来选择名称,如果我在Notepad ++中,则使用processed_\1.png替换它们,但我无法在PowerShell中使用它(I&I #39;我肯定错过了正确的语法):

[...] | Rename-Item -NewName { $_.Name -replace ".*?(?:\b|_)(L|H|M|X{1,3})(?:_|\b).*","banner_$Matches.groups[1].value" }

1 个答案:

答案 0 :(得分:1)

PowerShell中的反向引用以$开头,而不是\。但是,您必须将替换表达式放在单引号中或转义$,否则PowerShell会将$1扩展为常规变量:

$pattern = ".*?(?:\b|_)(L|H|M|X{1,3})(?:_|\b).*"
... | Rename-Item -NewName { $_.Name -replace $pattern, 'banner_$1' }

$pattern = ".*?(?:\b|_)(L|H|M|X{1,3})(?:_|\b).*"
... | Rename-Item -NewName { $_.Name -replace $pattern, "banner_`$1" }