我基本上有大量的文件,其中文件名包含内容的高度和宽度。文件的创建者将高度放在宽度的前面但我希望看到它们交换。问题是命名方案并不总是一样的。以下是一些例子:
(2位或3位数字是高度,数字+ sp是宽度)
123_5sp_abc
99_5sp
abc 123_3sp
abc 123_7sp_def
abc 99_1sp
abc 99_2sp_def
abc_123_4sp
abc_123_6sp_def
abc_99_2sp
abc_99_3sp_def
abc def ghj 99_4sp
abc_def_ghj 99_5sp
意味着唯一始终相同的是由_。
连接的高度和宽度我想出了不同组合的不同解决方案。像这样:
Get-ChildItem -Path C:\Temp\test|
where -filterscript {$_.BaseName -match '(.*)_(\d{2,3})_(\d.*)_(.*)'}|
Rename-Item -NewName {$matches[1]+'_'+
$matches[3]+'_'+
$matches[2]+'_'+
$matches[4]+$_.Extension}
我尝试的任何东西都无法处理每一个变化
我的问题:是否有一种简单的方法可以包含所有变体?
感谢您的努力!
答案 0 :(得分:0)
$regex = '([0-9]{2,3})_([0-9]+sp)'
Get-ChildItem -LiteralPath 'C:\Temp\test' |
Where-Object -FilterScript { $_.BaseName -match $regex } |
Rename-Item -NewName {
$_.Name -replace $regex, '$2_$1'
}
如果sp
是名称的一部分,它应该在正则表达式中以帮助它匹配正确的东西。您可以替换匹配组,而无需重建整个名称。我认为这涵盖了你的所有例子。