You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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
        }
    }
}

关键调整点

  1. 遍历的是FileInfo对象,而非字符串路径,所以能通过$file.FullName获取完整路径用于重命名
  2. 所有字符串操作都针对$file.Name(纯文件名),避免误处理路径中的横杠
  3. 新增了第三个减号的定位,确保准确截取掉中间的10部分

内容的提问来源于stack exchange,提问作者AlbertSan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 21:10:25