保留文件名中的初始字符,使用powershell删除所有剩余字符

问题描述 投票:0回答:2

我有一批文件名为: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”来保存扩展名。

powershell batch-rename
2个回答
4
投票

您可以使用-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预览重命名操作;删除它以执行实际重命名。


1
投票

mklement0给了你一个好的和有效的答案。这是另一种使用正则表达式的方法。

Get-ChildItem -Filter *.pdf |
    ForEach-Object {
        if ($_.Name -match '(.*?_.*?_.*?)_.*(_1.*)') {
            Rename-Item -Path $_.FullName -NewName $($Matches[1..2] -join '') -WhatIf
        }
    }
© www.soinside.com 2019 - 2024. All rights reserved.