問題描述
資料夾裡累積了超過兩百萬個檔案。透過 Windows 檔案總管直接刪除,系統會卡死,沒有回應。Windows 在計算資源回收桶確認與 GUI 進度時開銷極大,檔案數量一多就撐不住。
解決方案:使用批次檔
以下是使用的批次檔程式碼:
1 | @echo off |
如何使用這個批次檔
- 將上面的程式碼複製到文字編輯器(如記事本)。
- 存成
.bat格式,例如fast_delete_all.bat。 - 把這個
.bat檔放進想要清空的資料夾。 - 雙擊執行。
- 仔細閱讀警告訊息,確認路徑正確。
- 確認無誤後輸入
Y並按 Enter。
注意: Windows 不允許刪除正在執行中的程式,所以執行完畢後資料夾內仍會殘留這支
.bat檔本身,需手動刪除。
為什麼這個方法有效
核心是 robocopy(Robust File Copy),Windows 內建的強大檔案複製工具。這裡用它把空資料夾鏡像到目標,讓目標多出來的所有檔案都被清除。
/mir 讓 robocopy 將目標資料夾鏡像成與空來源一致,因此目標中所有多餘的檔案都會被刪除。比直接在檔案總管刪除快的原因,是跳過了 GUI 的縮圖運算、資源回收桶確認及進度回報等 shell 開銷——每個檔案的刪除系統呼叫本身同樣是逐一執行的。/mt:32 開啟多執行緒,對以複製為主的情境效果顯著;不過在這個純刪除(purge)的使用情境下,加速效果有限,主要還是靠前述跳過 shell 開銷的優勢。
關於 exit code: robocopy 在純刪除操作後 exit code 通常是 1 或 3(非 0),若在外層腳本以 errorlevel 判斷成敗,會誤判為失敗。如果需要讓外層腳本正確判讀,可在 bat 最後加一行 exit /b 0。
關於重複執行: 若 empty_temp 目錄已存在(例如上次執行時 rmdir 失敗),robocopy 仍可正常執行,不會 fail。但如果目錄非空,它的內容反而會被鏡像進來。保險起見,可在 mkdir 前加一行防禦:
1 | if exist empty_temp rd /s /q empty_temp |
安全提示
使用前請注意:
- 務必確認 bat 放在正確的資料夾——腳本以自身所在位置(
%~dp0)為操作目標。 - 這個批次檔會刪除資料夾內的所有內容,包括子資料夾與隱藏檔案,無法復原。
- 執行前先備份重要資料。
本部落格所有文章除特別聲明外,均採用CC BY-NC-SA 4.0 授權協議。轉載請註明來源 kyosora 筆記!
評論




