問題描述

資料夾裡累積了超過兩百萬個檔案。透過 Windows 檔案總管直接刪除,系統會卡死,沒有回應。Windows 在計算資源回收桶確認與 GUI 進度時開銷極大,檔案數量一多就撐不住。

解決方案:使用批次檔

以下是使用的批次檔程式碼:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
@echo off
setlocal enabledelayedexpansion

set "folder_path=%~dp0"

echo 警告:此批次檔案將快速刪除以下資料夾中的所有檔案和子資料夾:
echo %folder_path%
echo.
echo 請確認這是您想要清空的正確資料夾。
echo 按 Y 繼續,或按任意其他鍵取消操作。
set /p confirm=確認刪除 (Y/N)?

if /i "%confirm%" neq "Y" (
echo 操作已取消。
goto :EOF
)

echo.
echo 正在快速刪除所有內容,請稍候...

pushd "%folder_path%"

:: 使用 robocopy 來快速清空資料夾
mkdir empty_temp
robocopy empty_temp . /mir /mt:32

:: 刪除臨時資料夾
rmdir empty_temp

popd

echo 所有內容已被刪除。

echo.
echo 按任意鍵退出。
pause > nul

如何使用這個批次檔

  1. 將上面的程式碼複製到文字編輯器(如記事本)。
  2. 存成 .bat 格式,例如 fast_delete_all.bat
  3. 把這個 .bat 檔放進想要清空的資料夾。
  4. 雙擊執行。
  5. 仔細閱讀警告訊息,確認路徑正確。
  6. 確認無誤後輸入 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

安全提示

使用前請注意:

  1. 務必確認 bat 放在正確的資料夾——腳本以自身所在位置(%~dp0)為操作目標。
  2. 這個批次檔會刪除資料夾內的所有內容,包括子資料夾與隱藏檔案,無法復原。
  3. 執行前先備份重要資料。