保留文件名中的初始字符,使用 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
}
}
我有一批文件,名称如下: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
}
}