如何按文件名末尾第三个分隔符重命名文件?PowerShell实现求助
PowerShell 按分割符截取文件名并重命名
需求说明
需要将类似 a_b_c_d_e_f.txt 的文件名重命名为 a_b_c.txt,即保留文件名基名中前3个下划线分隔的部分,再拼接原扩展名。
现有代码的局限性
你当前的代码通过固定截取字符长度实现重命名:
Get-ChildItem 'C:\Users\xxx\Projects\testfiles' -filter *.txt | Rename-Item -NewName {$_.name.substring(0,$_.BaseName.length-9) + $_.Extension}
这种方式仅适用于要删除的字符长度固定的场景,一旦文件名结构变化(比如下划线分隔的部分数量改变)就会出错,灵活性很差。
实现思路与代码
更可靠的方式是按下划线分割文件名基名,提取指定部分后重新拼接,具体实现如下:
基础实现(直接保留前3个部分)
Get-ChildItem 'C:\Users\xxx\Projects\testfiles' -Filter *.txt | Rename-Item -NewName { ($_.BaseName -split '_')[0..2] -join '_' + $_.Extension } -WhatIf
- 代码解释:
$_.BaseName -split '_':将文件名基名(不含扩展名)按下划线拆分为字符串数组,比如a_b_c_d_e_f会拆成@('a','b','c','d','e','f')[0..2]:提取数组中前3个元素(索引从0开始)-join '_':把提取的元素用下划线重新拼接成新的基名+ $_.Extension:拼接原文件扩展名-WhatIf:添加该参数可预览重命名效果,确认无误后再删除该参数执行实际重命名
健壮性优化(处理下划线不足3个的情况)
如果存在文件名基名下划线数量少于3个的情况,可以添加判断逻辑避免错误:
Get-ChildItem 'C:\Users\xxx\Projects\testfiles' -Filter *.txt | Rename-Item -NewName { $parts = $_.BaseName -split '_' # 若分割后的部分数≤3,保持原文件名;否则保留前3个部分 if ($parts.Count -le 3) { $_.Name } else { ($parts[0..2] -join '_') + $_.Extension } } -WhatIf
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

