我有一批文件,名称如下: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”来保存扩展名。
答案 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
}
}