我有一批文件名为:78887_16667_MR12_SMITH_JOHN_713_1.pdf
我需要保留前三组数字并删除第三个“_”和“_1.pdf”之间的所有内容。
所以这个:78887_16667_MR12_SMITH_JOHN_713_1.pdf
成为这个:78887_16667_MR12_1.pdf
理想情况下,我希望能够使用第3个“_”作为中断,因为第三组数字有时包括3个字符,有时包含4个字符(如示例),其他时间包括5个字符。
如果我使用这样的东西:
Get-ChildItem Default_*.pdf | Rename-Item -NewName {$_.name -replace...
......然后我被卡住了:我可以说第3个“”和“第6个”的所有内容都应该替换为“”(没有)吗?我的理解是我也包括“.Extension”来保存扩展名。
您可以使用-split
运算符将您的名称拆分为_
分隔的标记,提取感兴趣的标记,然后再次使用-join
运算符将它们连接起来:
PS> ('78887_16667_MR12_SMITH_JOHN_713_1.pdf' -split '_')[0..2 + -1] -join '_'
78887_16667_MR12_1.pdf
0..2
提取前3个令牌,-1
提取最后一个(你可以将这个索引数组写成0, 1, 2, -1
)。
应用于重命名文件的上下文中:
Get-ChildItem -Filter *.pdf | Rename-Item -NewName {
($_.Name -split '_')[0..2 + -1] -join '_'
} -WhatIf
常用参数-WhatIf
预览重命名操作;删除它以执行实际重命名。
mklement0给了你一个好的和有效的答案。这是另一种使用正则表达式的方法。
Get-ChildItem -Filter *.pdf |
ForEach-Object {
if ($_.Name -match '(.*?_.*?_.*?)_.*(_1.*)') {
Rename-Item -Path $_.FullName -NewName $($Matches[1..2] -join '') -WhatIf
}
}