PowerShell批量重命名:移除文件名第二、第三个横杠间的内容
PowerShell 文件重命名解决方案
核心问题解决思路
你不需要单独提取文件名或完整路径,直接保留Get-ChildItem返回的FileInfo对象即可——它同时包含文件名、目录路径等所有必要信息,既能安全处理文件名,又能准确执行重命名操作。
方案一:正则替换(简洁高效)
针对你的需求,用正则表达式可以一步完成文件名修改,无需手动截取字符串:
# 获取目标目录下的所有文件(保留FileInfo对象,不要取.FullName) $files = Get-ChildItem -Path $folder -Recurse -File foreach ($file in $files) { # 匹配格式:前缀-年份-月份-日期.后缀,移除月份部分 $newFileName = $file.Name -replace '^(.*-\d{4})-\d{2}-(\d{2}\.\w+)$', '$1-$2' # 执行重命名(如果新文件名和原文件名不同才操作,避免无意义执行) if ($newFileName -ne $file.Name) { Rename-Item -Path $file.FullName -NewName $newFileName } }
正则说明
^(.*-\d{4}):匹配从开头到第一个年份(如ABCDE-2020)的部分,作为第一个捕获组$1-\d{2}-:匹配中间的月份部分(如-10-)(\d{2}\.\w+)$:匹配日期和后缀(如20.txt),作为第二个捕获组$2- 替换后将两个捕获组用
-连接,直接得到目标文件名
方案二:基于你的字符串处理逻辑调整
如果你想沿用自己的字符串截取思路,只需针对$file.Name操作,再结合文件对象的目录路径构造完整重命名路径:
$files = Get-ChildItem -Path $folder -Recurse -File foreach ($file in $files) { $fileName = $file.Name $newString = $fileName -replace "-", "" $count = $fileName.Length - $newString.Length if ($count -ge 3) { $s01 = $fileName.IndexOf("-", 0) $s02 = $fileName.IndexOf("-", $s01 + 1) $s03 = $fileName.IndexOf("-", $s02 + 1) # 新增:找到第三个减号位置 # 拼接新文件名:前缀 + 第三个减号之后的部分 $newFileName = $fileName.Substring(0, $s02) + $fileName.Substring($s03) if ($newFileName -ne $fileName) { Rename-Item -Path $file.FullName -NewName $newFileName } } }
关键调整点
- 遍历的是FileInfo对象,而非字符串路径,所以能通过
$file.FullName获取完整路径用于重命名 - 所有字符串操作都针对
$file.Name(纯文件名),避免误处理路径中的横杠 - 新增了第三个减号的定位,确保准确截取掉中间的
10部分
内容的提问来源于stack exchange,提问作者AlbertSan
相关产品推荐
相关产品推荐

