PowerShell批量修改JPG文件名:删除首个下划线前前缀及排重
修正PowerShell批量重命名JPG文件的问题
原代码的核心问题
- 文件名截取错误:
$_.Name.Split("_")[1]仅提取了第一个下划线与第二个下划线之间的片段,而非第一个下划线之后的全部内容,导致最终文件名丢失后半部分(比如12_defg_0001.jpg会被截成defg,而非预期的defg_0001.jpg)。 - 未处理重复文件名:当多个文件处理后生成相同文件名时,重命名操作会因冲突失败。
修正后的代码
$mainfolder = "C:\Users" # 仅遍历目标文件夹下的JPG文件,排除子文件夹 Get-ChildItem -Path $mainfolder -Filter *.jpg -File | ForEach-Object { # 提取第一个下划线之后的完整文件名(含扩展名) $newName = $_.Name -replace '^[^_]+_', '' $targetPath = Join-Path -Path $_.DirectoryName -ChildPath $newName # 处理文件名重复的情况:自动添加序号后缀 $counter = 1 while (Test-Path -Path $targetPath) { $baseName = [System.IO.Path]::GetFileNameWithoutExtension($newName) $extension = [System.IO.Path]::GetExtension($newName) $newName = "$baseName($counter)$extension" $targetPath = Join-Path -Path $_.DirectoryName -ChildPath $newName $counter++ } # 执行重命名(-WhatIf用于预览操作,确认无误后可删除) Rename-Item -Path $_.FullName -Destination $targetPath -WhatIf }
关键说明
- 正则截取文件名:
-replace '^[^_]+_', ''通过正则匹配,直接删除从文件名开头到第一个下划线(含下划线)的所有内容,确保保留第一个下划线之后的完整部分。 - 精准筛选文件:
-Filter *.jpg -File限定只处理JPG格式的文件,避免误操作文件夹或其他类型文件。 - 重复文件名处理:通过
Test-Path检查目标文件名是否已存在,若存在则自动在文件名后添加(1)、(2)等序号,直到生成唯一文件名。 - 预览模式:代码中的
-WhatIf参数会显示所有将要执行的重命名操作,不会实际修改文件。确认操作符合预期后,删除该参数即可执行真实重命名。
内容的提问来源于stack exchange,提问作者Marylink_27
相关产品推荐
相关产品推荐

