使用PowerShell批量重命名过长文件名:保留特定后缀与扩展名
批量缩短Windows长文件名(保留[General_xxx]标识与扩展名)
问题说明
我有近8000个文件名/路径长度超出Windows限制的文件,需要保留文件夹结构,因此必须缩短文件名。文件名示例:
File description that is waaay too long for Windows ABCD [General_123].doc File description that is waaay too long for Windows AB123 [General_456].docx Spreadsheet for Year 2023 with a too long name [General_159].xls
所有文件名均以[General_xxx]结尾,但该标识的起始位置不固定。我的需求是删除文件名末尾约20个字符,同时保留[General_xxx]和文件扩展名。自己写的脚本无法实现这个逻辑:
Get-ChildItem | rename-item -newname { $_.name.substring(0,$_.name.length-20) + $_.Extension }
修正后的脚本
核心是先定位[General_xxx]的位置,只缩短该标识之前的内容,再拼接保留的部分和扩展名:
Get-ChildItem -File | Rename-Item -NewName { $baseName = $_.BaseName $extension = $_.Extension # 匹配结尾的[General_xxx](xxx为数字) $generalMatch = [regex]::Match($baseName, '\[General_\d+\]$') if ($generalMatch.Success) { $generalPart = $generalMatch.Value # 提取[General_xxx]之前的文本并去除末尾空格 $prefix = $baseName.Substring(0, $generalMatch.Index).Trim() # 缩短前缀:减去20个字符,最短保留1个字符避免空文件名 $shortenedPrefix = if ($prefix.Length -le 20) { $prefix.Substring(0, 1) } else { $prefix.Substring(0, $prefix.Length - 20) } # 拼接新文件名 "$shortenedPrefix $generalPart$extension" } else { # 未匹配到标识时保留原文件名,可按需修改 $_.Name } } -WhatIf
关键说明
-File参数确保只处理文件,不涉及文件夹- 正则表达式
\[General_\d+\]$精准匹配结尾的[General_xxx]部分 - 仅缩短
[General_xxx]之前的前缀内容,保证标识和扩展名完整保留 -WhatIf用于预览重命名结果,确认无误后删除该参数执行实际操作
内容的提问来源于stack exchange,提问作者JParish
相关产品推荐
相关产品推荐

