如何交换多个文件名的部分?

时间:2018-04-26 19:01:30

标签: powershell swap batch-rename

我基本上有大量的文件,其中文件名包含内容的高度和宽度。文件的创建者将高度放在宽度的前面但我希望看到它们交换。问题是命名方案并不总是一样的。以下是一些例子:

(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}

我尝试的任何东西都无法处理每一个变化

我的问题:是否有一种简单的方法可以包含所有变体?

感谢您的努力!

1 个答案:

答案 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是名称的一部分,它应该在正则表达式中以帮助它匹配正确的东西。您可以替换匹配组,而无需重建整个名称。我认为这涵盖了你的所有例子。