杂记 › 技术笔记 › 批量建目录的脚本里,编号补零和 CON 这两个坑最容易被忽略

批量建目录的脚本里,编号补零和 CON 这两个坑最容易被忽略

给一门课的学生各建一个交作业的目录,再给每人配提交位和批改位,就是上百次右键;写成一段脚本扔目标机上跑一次省事得多。脚本看着没什么好讲,可我第一次跑完目录少建了两个,换台机器上级目录又整个没出来,才回去逐字对了正文。

同一段清单,三种脚本写的不是同一类命令

左边一栏清单、右边一段正文,中间没有加工。首屏输入框里是 5 行清单,前四行都是 项目/xx 这种两级中文路径;模板第 205 行在页面加载时自己生成过一次,第一段正文是现成的 BAT,12 行、188 字节。换到 文件夹批量创建 的另两档,Shell 是 11 行、203 字节,PowerShell 同样 11 行却 443 字节,比 BAT 多 255 字节。

对比项Windows BATLinux ShellPowerShell
每行目录变成md "项目\文档"mkdir -p "项目/文档"New-Item -ItemType Directory -Force -Path "项目/文档" | Out-Null
多层级能否落地父目录不存在则整条失败-p 递归创建-Force 允许建不存在的父目录
头部 / 尾部行数4 / 3,末尾多一句 pause4 / 24 / 2
150 个目录时157 行 / 3544 字节156 行 / 4429 字节156 行 / 11049 字节

行数只跟目录数线性相关:BAT 是 N+7,另两种是 N+6,N=1 排到 150 全部吻合,命令条数恒等于 N。那 150 行是 3 个根目录各配 50 个编号凑的,首个 项目/folder_001、末个 backup/folder_050。BAT 多的那一行是收尾 pause,跑完停住等按键,另两种不停。

Windows BAT 157 行 / 3544 字节 Linux Shell 156 行 / 4429 字节 PowerShell 156 行 / 11049 字节

图 1|同一份 150 行清单的字节账,条形按字节等比;PowerShell 每条都重复 New-Item 那串参数。

斜杠建不建得出层级,只有两档说了算

md "项目\文档" 这条里,cmd 的 MD 没有递归开关,父目录不存在整条就失败;-p 与 -Force 那两条才落得下来。分隔符也只被 replace 过一次,源码里没有逐层拆开的循环,IF EXIST 与 for /d 都是 0 次,所以页面那句「将自动创建多级目录」只对两档成立。

补零位数选小不会重名,但会改掉名字

我原本认定位数小于编号就会撞名,超出的位被吃掉。实测不会:padStart 只在左侧补零、从不截断。位数 2、编号 1 到 200 那组,第 98 到 102 项是 folder_98 folder_99 folder_100 folder_101 folder_102,200 个名字一个不重;位数 0 到 6、起始 0 到 50、结束到 200 穷举一遍是 357 组配置、5599307 个名字,重名 0 组。

最长名字符数 p=0 folder_1 8 p=2 folder_01 9 p=3 folder_001 10 默认档 p=4 folder_0001 11 p=5 folder_00001 12 重名 0 个;p=1 与 p=6 选不到

图 2|起始 1、结束 5 逐档实测:位数 0、2、3、4、5 的最长名是 8 到 12 字符,只变长、不重名。

代价在别处。同一段 1 到 12,位数 2 起首 folder_01、末尾 folder_12 一种长度,位数 1 混出两种,排序与通配跟着错位。负数更直接:起始写 -1、结束 1、位数 3,拿到 folder_0-1 folder_000 folder_001,补零补到负号左边,min="0" 只管校验样式、代码不夹紧。默认口径记牢:位数 3、起始 1、结束 50,出来 folder_001 到 folder_050 共 50 个,不是文案举例的 folder_01 到 folder_99。

CON 和 nul 会被原样写进那一行

我拿 25 行名字压了一遍:CON、PRN、nul、AUX、com1、LPT9 六个保留名,带空格与制表符的、含斜杠与反斜杠的、带冒号 星号 问号 双引号 尖括号 竖线的,纯点的 .. 与 ...,再加两行相同的 END。三种脚本各写 25 条命令,与输入行数一样:没去重,END 出现 2 次就是 2 条,保留名与非法字符 0 处校验。报错留到跑脚本那一步——Windows 到 CreateDirectory 才拒绝这些字符和 COM1-9、LPT1-9,名字里带英文双引号的还会让 md "quote"name" 提前闭合。重复行也照写:6 行输入去重只剩 3 条命令,BAT 第二次撞到同一目标会报「目录已存在或不合法」。

只校验一处,报错时输出区还是旧的

取名单的代码只有 1 处校验:结束编号小于起始编号时弹一句「结束编号需大于起始编号」再直接返回。副作用值得记——输出区与统计区都不刷新:我把 150 行那份跑完再把结束编号改小,错弹了,屏幕上仍是上一次的 157 行正文,这时候复制拿走的就是旧脚本。

其余边界全是静默的:起始留空、结束填 3,parseInt 得 NaN 再回落成 0,于是 0 到 3 共 4 个目录,而人以为只有 3 个;结束写 1e3 只读到 1;位数改成非数字就按不补零出 folder_1;前缀不清洗,30 个字符配 1 到 60 就得到 60 个 34 字符的名字。两处安全的顺带说:粘进来的 CRLF 按 LF 切行、每行 trim,CR 被吃掉不会跟进目录名;统计区只有「文件夹数量」与「脚本类型」2 项。

复制、下载与行尾

下载文件名固定是 create_folders 加扩展名,三档 .bat、.sh、.ps1,没有时间戳也没有随机串;三种正文行尾全是 LF、0 行含 CR,那个 .bat 并不自带 Windows 换行。清单往往不干净:一批完整路径我先丢给 从路径里取文件名 抽成末级名,散在长文本里的用 批量提取信息 按规则抓,再进生成。

Q:为什么跑完少建了两个目录?

命令条数永远等于清单行数,少建的是运行时被拒的那几行:25 行特殊名照样生成 25 条命令,保留名和非法字符要到 CreateDirectory 才失败。另一条是清单里有重复行,6 行只落 3 个目录。

Q:folder_001 和 folder_01 哪个对?

都不算错,但默认那档是 folder_001 到 folder_050,因为位数选中的是 3。要 folder_01 得手动改选「2位」,要 folder_1 就选「不补零」;位数只决定补零长度,不会造成重名。

Q:脚本会不会覆盖已有的文件?

这次核对只证到一件事:工具不做检查、也不碰磁盘,行为完全交给 md、mkdir -p、New-Item 三条命令自己决定。能确认的只有 BAT 对重复目标第二次报「目录已存在或不合法」。

📎 相关文章

把质量调到 100 再压一次,图片其实一个字节都没动 2026-10-21 同一个数打两遍,最小公倍数成了 94906266.99999999:先乘后除撞上限的是中间量 2026-10-21 后缀从最后一个点算起:LICENSE、.gitignore、archive.tar.gz 为什么会漏改 2026-10-21 同一句中文,UTF-8 存 12 字节、GBK 只存 8 字节:编码是怎么被判错的 2026-10-21 接口返回的 JSON 导成 CSV,Excel 里为什么少了一列 2026-10-21