我经常遇到同一类活:一堆文件要按规则改名------照片要按日期、日志要按月份、下载的文件要去掉一堆后缀。 以前我手动改,改到第 30 个就开始出错(漏一个、改重一个、把扩展名也改掉)。
这篇文章给你一个不用装任何软件的做法,附带我踩过的四个坑。
一、先说结论:三种改法,按场景选
| 场景 | 做法 | 优点 | 风险 |
|---|---|---|---|
| 少量文件(<20) | 资源管理器里 F2 → Tab → 输入 连续改名 | 不用命令 | 手滑就改名错 |
| 规则明确、量中等 | PowerShell 一行改(下面给) | 可预览、可回滚 | 写错正则就批量毁名 |
| 规则复杂、要试 | 先脚本生成"改名清单",人工过一遍再执行 | 最安全 | 多一步 |
核心原则只有一条 :先打印出"谁改成谁",确认无误,再真改。 不预览直接改名的,迟早会毁掉一批文件。
二、PowerShell 一行(可预览、可回滚)
第一步:只看不改(这条最关键)
powershell
Get-ChildItem *.jpg | ForEach-Object {
$new = "IMG_{0:yyyyMMdd_HHmmss}{1}" -f $_.LastWriteTime, $_.Extension
[pscustomobject]@{旧=$_.Name; 新=$new}
} | Format-Table -AutoSize
它会列出 每个文件"旧名 → 新名"。确认没问题再执行第二步:
powershell
Get-ChildItem *.jpg | ForEach-Object {
$new = "IMG_{0:yyyyMMdd_HHmmss}{1}" -f $_.LastWriteTime, $_.Extension
Rename-Item -LiteralPath $_.FullName -NewName $new
}
回滚 :改名是可逆的(把 旧/新 两列存下来就能反着改)。 ⇒ 所以第一步的表格要复制到文件里保存,别只是看一眼。
三、我踩过的四个坑
坑 1:用 -f 拼接时忘了扩展名。 "IMG_$($_.LastWriteTime)" 会把 .jpg 丢掉,生成一堆没有扩展名 的文件。 ⇒ 永远用 $_.Extension 显式带上,别靠记忆。
坑 2:同名冲突,静默覆盖。 两个文件的 LastWriteTime 精确到秒可能一样 ⇒ 生成同名 ⇒ Rename-Item 直接报错 (还算好), 但如果加了 -Force,就是静默覆盖 。⇒ 不要加 -Force,让它报错。
坑 3:文件名里有方括号 / 空格 / 中文引号。 Rename-Item -Path 会把 [ ] 当通配符 解析 ⇒ 匹配不到或匹配错。 ⇒ 一律用 -LiteralPath(我上面给的写法就是)。
坑 4:把"改名"和"移动"混在一起做。 一次做两件事,出问题时不知道是哪一步错了 。⇒ 分两次:先改名(原地),确认后再移动。
四、如果你想更稳:先生成"改名清单",人工过一眼
规则复杂时(比如"去掉前面 8 位数字 + 把 -final 换成 _v2"),我会先输出一份 CSV : 两列 旧路径、新路径,用 Excel 或记事本过一遍,删掉不想改的行,再按 CSV 执行 。 这样人工只做审核,不做打字 ------ 出错率低一个数量级。
五、三个"要不要装软件"的回答
- 要不要装批量改名软件? 上面这套够用,不需要;
- 要不要写代码? 一行 PowerShell 就是"代码",但它可预览、可回滚,比软件更可控;
- 要不要备份? 要。改名之前把那个文件夹复制一份,是最省事的"回滚点"。
六、一句话
批量操作的第一原则不是"快",是"先看清楚再动手"。 我改坏了两次文件名,两次都是因为跳过了预览那一步。