使用PowerShell读取CSV/TXT文件实现批量文件重命名
PowerShell 基于CSV/TXT映射规则的批量重命名脚本
规则文件准备
脚本支持CSV和TXT两种格式的规则文件,格式要求统一:
- 每行代表一条重命名规则
- 每行用英文逗号分隔两部分内容:逗号前是要匹配的文件名关键词/完整名称(对应CSV A列),逗号后是重命名后的目标名称(对应CSV B列)
- 空行、缺少任意一部分的无效行会被自动跳过
示例规则文件内容:
blah,.BackupFile report_2024Q1,2024年第一季度运营报告 old_project_archive,已归档项目资料
完整实现脚本
脚本兼容原有固定匹配逻辑,同时增加了重名冲突处理、规则校验、遍历异常规避的优化,代码如下:
# -------------------------- 按需修改配置项 -------------------------- $scanPath = "C:\你的目标文件存放目录" # 替换为实际要扫描的文件夹路径,不建议直接扫整个C盘 $ruleFilePath = "C:\rename_rules.csv" # 规则文件存放路径,支持.csv/.txt格式 $recursiveScan = $true # 是否递归扫描所有子文件夹 $matchMode = "fuzzy" # 匹配模式:fuzzy=模糊匹配(文件名包含匹配串即命中,和原有逻辑一致);exact=精确匹配(文件名完全等于匹配串才命中) # ------------------------------------------------------------------- # 加载并校验规则 $renameRules = @() if (-not (Test-Path $ruleFilePath)) { Write-Error "规则文件不存在,请检查路径配置:$ruleFilePath" exit 1 } $validLines = Get-Content $ruleFilePath -Encoding UTF8 | Where-Object { $_.Trim() -ne "" } foreach ($line in $validLines) { # 只按第一个逗号分割,避免新名称里带逗号被错误切分 $ruleParts = $line -split ',', 2 if ($ruleParts.Count -eq 2 -and $ruleParts[0].Trim() -and $ruleParts[1].Trim()) { $renameRules += [PSCustomObject]@{ MatchStr = $ruleParts[0].Trim() ReplaceStr = $ruleParts[1].Trim() } } } if ($renameRules.Count -eq 0) { Write-Error "未读取到有效重命名规则,请检查规则文件格式" exit 1 } # 先一次性拉取所有待扫描文件,避免遍历过程中重命名导致的枚举异常 $allTargetFiles = Get-ChildItem -Path $scanPath -File -Recurse:$recursiveScan -ErrorAction SilentlyContinue foreach ($file in $allTargetFiles) { foreach ($rule in $renameRules) { $hit = $false # 按配置的模式做匹配判断 if ($matchMode -eq "fuzzy") { if ($file.Name -like "*$($rule.MatchStr)*") { $hit = $true } } else { # 精确匹配默认不带扩展名,需要匹配带扩展名的完整文件名就把下面的比较值换成$file.Name if ([System.IO.Path]::GetFileNameWithoutExtension($file.FullName) -eq $rule.MatchStr) { $hit = $true } } if ($hit) { # --- 下面是重命名逻辑,可根据自己的需求调整 --- # 默认逻辑:新名称=规则里的替换名+原文件扩展名 $newFileName = $rule.ReplaceStr + $file.Extension # 如果要实现原来的「保留原文件名追加后缀」逻辑,把上面一行注释掉,放开下面这行 # $newFileName = [System.IO.Path]::GetFileNameWithoutExtension($file.FullName) + $rule.ReplaceStr + $file.Extension # 重名自动加数字后缀,避免覆盖文件 $savePath = Join-Path $file.DirectoryName $newFileName $dupIndex = 1 while (Test-Path $savePath) { $newFileName = "$($rule.ReplaceStr)_$dupIndex$($file.Extension)" # 用追加后缀逻辑的话,上面一行替换成下面这行 # $newFileName = [System.IO.Path]::GetFileNameWithoutExtension($file.FullName) + "$($rule.ReplaceStr)_$dupIndex" + $file.Extension $savePath = Join-Path $file.DirectoryName $newFileName $dupIndex++ } # 执行重命名 Rename-Item -Path $file.FullName -NewName $newFileName -ErrorAction SilentlyContinue Write-Host "重命名完成:$($file.Name) -> $newFileName" # 命中一条规则就终止后续匹配,避免重复改名 break } } }
使用注意事项
- 首次运行建议先把
Rename-Item那行注释掉,执行脚本看控制台输出的重命名结果是否符合预期,确认无误后再放开执行,避免误改文件。 - 规则文件保存时请选择UTF8编码,避免中文匹配、中文名称乱码。
- 精确匹配默认判断不带扩展名的文件名,如果需要匹配带扩展名的完整文件名,修改对应判断逻辑的比较值即可。
- 尽量不要直接扫描整个C盘,系统目录文件被误改可能导致系统运行异常,建议指定具体的工作目录执行。
内容的提问来源于stack exchange,提问作者Shabbaranks
相关产品推荐
相关产品推荐

