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

时间:2018-09-10 22:06:33

标签: powershell batch-rename

我有一批文件,名称如下:78887_16667_MR12_SMITH_JOHN_713_1.pdf

我需要保留前三组数字,并删除第三个“ _”和“ _1.pdf”之间的所有内容。

所以这:78887_16667_MR12_SMITH_JOHN_713_1.pdf

成为这个:78887_16667_MR12_1.pdf

理想情况下,我希望能够仅使用第三个“ _”作为分隔符,因为第三组数字有时包含3个字符,有时包含4个字符(如示例),有时包含5个字符。

如果我使用了类似的方法:

Get-ChildItem Default_*.pdf | Rename-Item -NewName {$_.name -replace... 

...然后我陷入困境:我可以声明将第三个“ ”和第六个“ ”中的所有内容都替换为“”(什么都没有)吗?我的理解是,我也将包括“ .Extension”来保存扩展名。

2 个答案:

答案 0 :(得分: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 :(得分:1)

mklement0给了您一个很好的工作答案。这是使用正则表达式的另一种方法。

Get-ChildItem -Filter *.pdf |
    ForEach-Object {
        if ($_.Name -match '(.*?_.*?_.*?)_.*(_1.*)') {
            Rename-Item -Path $_.FullName -NewName $($Matches[1..2] -join '') -WhatIf
        }
    }