2016-04-26 17 views
0

我想用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中工作(我肯定缺少這裏的正確語法) :

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

回答

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" } 
+0

啊,沒想到逃逸!像魅力一樣工作。謝謝。 – watery

相關問題