如何交换多个文件名的一部分?
How to swap parts of multiple filenames?
我基本上有大量文档,其中文件名包含内容的高度和宽度。文件的创建者将高度放在宽度前面,但我希望看到它们交换。问题是命名方案并不总是相同的。以下是一些示例:
(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}
我尝试过的任何东西都无法处理所有变化
我的问题:有没有简单的方法来包含所有变体?
感谢您的努力!
$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, '_'
}
如果 sp
是名称的一部分,它应该在正则表达式中以帮助它匹配正确的东西。您可以替换匹配组,而无需围绕它重建整个名称。我认为这涵盖了您的所有示例。
我基本上有大量文档,其中文件名包含内容的高度和宽度。文件的创建者将高度放在宽度前面,但我希望看到它们交换。问题是命名方案并不总是相同的。以下是一些示例:
(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}
我尝试过的任何东西都无法处理所有变化
我的问题:有没有简单的方法来包含所有变体?
感谢您的努力!
$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, '_'
}
如果 sp
是名称的一部分,它应该在正则表达式中以帮助它匹配正确的东西。您可以替换匹配组,而无需围绕它重建整个名称。我认为这涵盖了您的所有示例。