编写PowerShell脚本:按文本列表批量重命名指定文件夹文件
PowerShell脚本实现批量按列表重命名文件
没问题,我来帮你写这个PowerShell脚本,完美匹配你的需求——从文本文件读文件名列表,按顺序给目标文件夹里的文件重命名。
先直接上完整脚本,你可以直接用,后面我会拆解每部分的作用:
# 配置参数,你需要修改这几个路径 $nameListPath = "C:\path\to\your\filename-list.txt" # 存文件名列表的文本文件 $targetFolder = "C:\path\to\your\files-to-rename" # 待重命名文件所在的文件夹 # 读取文件名列表,跳过空行 $newNames = Get-Content -Path $nameListPath | Where-Object { $_ -notmatch '^\s*$' } # 获取目标文件夹里的文件,这里默认按创建时间排序,你可以根据需要改排序规则 $filesToRename = Get-ChildItem -Path $targetFolder -File | Sort-Object CreationTime # 检查文件名数量和文件数量是否匹配 if ($newNames.Count -ne $filesToRename.Count) { Write-Error "错误:文件名列表的行数($($newNames.Count))和目标文件夹的文件数($($filesToRename.Count))不匹配!" exit 1 } # 循环批量重命名 for ($i = 0; $i -lt $filesToRename.Count; $i++) { $oldFile = $filesToRename[$i] $newName = $newNames[$i] # 如果新名称不带扩展名,保留原文件的扩展名 if (-not [System.IO.Path]::HasExtension($newName)) { $newName = [System.IO.Path]::Combine([System.IO.Path]::GetDirectoryName($oldFile.FullName), "$newName$($oldFile.Extension)") } else { $newName = [System.IO.Path]::Combine($targetFolder, $newName) } # 检查新文件名是否已存在,避免覆盖 if (Test-Path -Path $newName) { Write-Warning "警告:文件 $newName 已存在,跳过重命名 $($oldFile.Name)" continue } # 执行重命名 Rename-Item -Path $oldFile.FullName -NewName $newName -ErrorAction Stop Write-Host "已重命名:$($oldFile.Name) → $([System.IO.Path]::GetFileName($newName))" } Write-Host "所有匹配的文件重命名完成!"
关键细节说明:
- 参数配置:开头的
$nameListPath和$targetFolder是你需要手动修改的路径,直接替换成你自己的文件和文件夹路径就行。 - 跳过空行:脚本会自动忽略文件名列表里的空行,避免因为误输入的空行导致重命名出错。
- 文件排序规则:默认按文件的创建时间排序来匹配列表顺序,如果你的需求是按其他顺序(比如文件名、修改时间),可以把
Sort-Object CreationTime改成Sort-Object Name或者Sort-Object LastWriteTime。 - 扩展名处理:如果你的文件名列表里不带扩展名,脚本会自动保留原文件的扩展名;如果列表里已经带了扩展名,就直接用列表里的名称。
- 防覆盖检查:如果目标文件夹里已经有和新名称重复的文件,脚本会跳过这个文件并给出警告,不会直接覆盖。
- 错误处理:如果文件名数量和文件数量不匹配,脚本会直接报错退出,避免部分重命名导致混乱。
使用注意事项:
- 先备份待重命名的文件!虽然脚本有防覆盖,但建议先复制一份文件到测试文件夹,测试没问题再用在正式文件上。
- 文件名列表里的每行就是一个新文件名,不要加引号或者其他多余符号。
- 如果你的文件名里有特殊字符(比如空格、中文),脚本完全支持,不需要额外处理。
内容的提问来源于stack exchange,提问作者scot
相关产品推荐
相关产品推荐

