雜記 › 技術筆記 › 批次建立目錄的指令碼裡,編號補零和 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 對重複目標第二次報「目錄已存在或不合法」。

📎 相關文章

PNG 壓了三遍只減 426 位元組:無損壓縮的真實邊界 2026-10-22 WebP 轉 PNG 後體積漲了幾倍:什麼時候必須轉,怎麼把漲幅壓住 2026-10-22 截圖縮到四分之一,小字糊成一團的三種原因 2026-10-22 同樣裁 300×300,頭像為什麼總偏右下角半格 2026-10-22 按每月 1.7 倍預估 18 個月,腳本和表格為什麼給出兩個數 2026-10-22