杂记 › 技术笔记 › 序号位数只是下限、重名时 (2) 插在后缀之前:批量重命名 2000 个文件的实测口径

序号位数只是下限、重名时 (2) 插在后缀之前:批量重命名 2000 个文件的实测口径

跑完重命名脚本才发现两个文件撞在一起;另一批照片位数设成 3,脚本里混着 6 个 8 字符的名字。这不是规则没生效,而是规则跟表单上写的约束不是一回事。

批量重命名 模板里那几个函数抽出来跑一遍,落点很具体:位数只是下限,编号插在主名与后缀之间,手改过的那行不参与避让。

位数设的是下限,不是宽度

「序号位数」那栏写着 min="0" max="9",看着像被约束住了,真正执行的只有 brPad(T300 起):位数不够时补 0,从来不裁。brPad(999,3) 得 999,brPad(10000,3) 得 10000。那两个表单属性对 JS 没有约束力,pad=9 得 000000001.jpg,填 12 得 000000000001.jpg,填 -2 也照代码生效。

规模 / 位数字符数分布读法
105 个 / pad=26 字符 99 个,7 字符 6 个第 100 个起整列变宽
1005 个 / pad=37 字符 999 个,8 字符 6 个999 之后只能多一位
12 个 / pad=1216 字符 12 个表单的 max=9 不被执行
1005 个文件 pad=3 7 字符 999 8 字符 6 图 1:位数只补零不截断

重名:编号插在后缀之前

conflict 的默认档 auto 遇到一堆行指向同一个名字时,不报错、不跳过、也不覆盖先到的那一行,而是把后撞的改成「主名 + 空格 + (2) + 原样的点和后缀」,行内标「重名,已自动追加编号」。50 行全撞时末行是 same.txt (50).txt,带标注的只有 49 行。编号落在主名与原后缀之间:a.b.tar.gz 撞车后追加出来的是 x.tar.gz (2).gz。

判撞名用 toLowerCase,Photo.jpg / PHOTO.JPG / photo.jpg 算同一个坑,避让后写成 same.txt (2).JPG——编号加上了,后缀大小写仍跟着各行原样;另一档 skip 写「重名,已保持原名」。

手改与关掉的那一行:避让的两个例外

行内改名字走 brEditRow(T561-571),只重算统计条和脚本,不跑 brDedupe。把 p.txt 与 q.txt 两行都手打成 p.txt,表格当场两条同名,导出也两条都收,脚本里那条 Rename-Item -LiteralPath 'q.txt' -NewName 'p.txt' 改的是磁盘上已经存在的名字。要等下一次规则变化,brDedupe 才把它补成 p (2).txt。

关掉某一行的「改名」,它不再产新名,却照样先占住原名:x.txt 与 b.txt 两行,find 写 x、repl 写 b,再把 b.txt 那行关掉,活着的 x.txt 会被推成 b (2).txt。这一页 0 次磁盘写回,没有 undo、redo、history,改名全靠导出的 ps1 / bat / sh。

后缀的四条口径

brSplitName 只认最后一个点,a.tar.gz 的主名是 a.tar、后缀是 gz;.gitignore 这类点开头的名字判成「无扩展名」,前导点保留。大小写不越界:选「全部小写」时 DSC Photo JPG.jpeg 出来是 dsc-photo-jpg.jpeg,尾巴上的 .jpeg 一动不动,后缀要小写必须另外选「统一小写」。

没勾「连扩展名一起替换」时,替换只喂最后一个点之前的主名:find 写 \..*、repl 留空,a.tar.gz 只得到 a.gz,因为程序又把原后缀接回末尾;find 写成字面的 .gz 时输出完全不变,勾上开关才得到 a。反向的坑是扩展名选「强制指定」却不填值,Photo.JPG、doc.pdf 变成 Photo、doc,后缀整段消失,还不进「规则有问题」统计。

替换串里的 $ 不是字面量

勾上「按正则处理」后,repl 那栏的 $ 走 JS 替换语义。find 写 b、repl 写 $`X,abc.jpg 变成 aaXc.jpg:匹配之前那段 a 被整块塞进替换串;写 $&$& 得 abbc.jpg,写 $9 而没有第 9 组时原样留 a$9c.jpg。字面模式里按字面处理。

正则写错不会把页面弄崩:brReplace 返回一个哨兵串(T395),行内提示「正则表达式写错了」并保留原名,代价是判坏的整列不进导出。3 个文件、find 写 (:3 行都留在原名并标红,统计条「规则有问题:3」,导出 0 行、脚本框是空的,打包只弹「没有可导出的文件」。

上限和另外几个硬顶

一次最多收 2000 个。拖 2005 个进去,files 记 2000、表格 2000 行,预览只画前 400 行,末尾补一句「另有 1600 行未在预览里显示」。Rename-Item、ren、mv -n 各 2000 条,导出也是 2000 行。

拖入 2005 个之后 预览行 400 导出行 2000 脚本条 2000 图 2:预览之外仍算全量

另外三个数字也管着名字落地。主名的 160 字符硬顶:204 字符的原名截到 160 再接回 .txt,最终整名 164 字符,行内写「名称过长,已截到 160 字符」。Windows 保留名共 22 项(CON、PRN、AUX、NUL 加 COM 与 LPT 各 1 到 9),命中时加下划线前缀,CONSOLE.txt 和 LPT10 不判定。非法字符勾了清理是删掉,取消勾选换成下划线,note 仍写「已去掉非法字符」。

三个当场被问到的

Q:位数设小了,长名字会不会被截断?

不会。brPad 只在不够长时补 0,1005 个文件配 pad=3 依然留下 6 个 8 字符的名字;真正会截的是主名那条 160 字符硬顶。

Q:手改过一行之后,重名还会自动避让吗?

当下不会。brEditRow 不跑 brDedupe,两条同名可以一起进导出,要等下一次规则变化才被补成 p (2).txt。点任意模板按钮还会走 T679-683 那条无条件赋值,把手改过的行一起重算掉,没有还原入口。

Q:导出的批处理遇到同名会自己停下来吗?

脚本头部写着「重名会报错并停下」,但生成的 .bat 实测只有 @echo off、chcp 65001 >nul、rem 头加逐条 ren 共 13 行,没有 errorlevel、if exist、exit 任何一句,ren 撞名只打印一行错误、后面的命令接着跑。带「已有同名就不覆盖」语义的是 sh 的 mv -n;更通用的引号与中断口径,批量建目录那篇已经踩过一遍。

导出去跑之前看一遍

  • 把目标名那一列排一次序找重复,手改过的行没参与避让。
  • 看序号那一列的字符数分布,pad=3 里混进 8 字符是进位,不是设置丢了。
  • 扩展名选「强制指定」就必须填值,留空等于整段删掉后缀。
  • 勾了正则就把「规则有问题」读到 0 为止,坏的那几行不进导出;替换串里 $ 打头的写法先用正则测试对一遍结果。

📎 相关文章

后缀决定 MIME:同一份 70 字节 PNG 头改出 18 个后缀、13 种类型和 5 个未知 2026-10-23 转 JPG 时透明被强制填底色:91 个质量档位在 PNG 面前不参与编码 2026-10-23 「全部清除」后还剩 553 字节,「只去掉位置信息」连缩略图都没动 2026-10-23 证书指纹实测:1159 字节 DER 与 3 种摘要、4 种写法 2026-10-23 TOTP 口令差 30 秒就换码:±1 期反查能定位偏差,算法却只有 SHA-1 一档 2026-10-23