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

Retain initial characters in file names, remove all remaining characters using powershell

我有一批文件,名称如下: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... 

...然后我卡住了:我能说第 3 个“”和第 6 个“”中的所有内容都应该替换为“ " (nothing)? 我的理解是我会包含“.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
        }
    }