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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
Ca版本
@echo off
:: 啟用延遲環境變數擴展,使得可以在迴圈內即時更新變數值
setlocal enabledelayedexpansion

:: 切換至 UTF-8 編碼,確保日文等 Unicode 字符可正確處理
chcp 65001 > nul

:: ===== 基本設定 =====
:: 設定來源與目標資料夾、7-Zip 路徑
set "SOURCE=E:\E-Download" :: 來源資料夾,包含要壓縮的子資料夾
set "DEST=E:\E-Downloadzip" :: 輸出資料夾,存放壓縮後的檔案
set "7ZEXE=C:\Program Files\7-Zip\7z.exe" :: 7-Zip 執行檔路徑

:: ===== 錯誤檢查 =====
:: 檢查來源資料夾是否存在
if not exist "%SOURCE%" (
echo [✖] 錯誤:來源資料夾不存在「%SOURCE%」
echo 請確認路徑設定正確後再執行。
pause
exit /b 1
)

:: 檢查 7-Zip 程式是否存在
if not exist "%7ZEXE%" (
echo [✖] 錯誤:找不到 7-Zip 程式於「%7ZEXE%」
echo 請確認 7-Zip 已安裝或修改路徑設定。
pause
exit /b 1
)

:: ===== 準備工作 =====
:: 建立輸出資料夾(如無則建立)
if not exist "%DEST%" (
echo [!] 建立輸出資料夾:%DEST%
mkdir "%DEST%"
)

:: 創建臨時檔案來存儲資料夾清單,避免編碼問題
set "TEMPLIST=%TEMP%\folder_list_%RANDOM%.txt"
echo [*] 正在列出子資料夾並依建立時間排序...

:: 使用 PowerShell 依建立時間排序資料夾並儲存到臨時檔案
powershell -nologo -command ^
"Get-ChildItem -Path '%SOURCE%' -Directory | Sort-Object CreationTime | ForEach-Object { $_.FullName }" > "%TEMPLIST%"

:: 計算總資料夾數量,提供進度顯示
set /a total=0
for /f "usebackq delims=" %%A in ("%TEMPLIST%") do set /a total+=1
echo [i] 找到 %total% 個資料夾需要壓縮。
echo.

:: ===== 開始壓縮 =====
set /a current=0
for /f "usebackq delims=" %%F in ("%TEMPLIST%") do (
set /a current+=1
set "FULLPATH=%%F"

:: 獲取資料夾名稱,保留 Unicode 字符
for %%D in ("!FULLPATH!") do set "FOLDER=%%~nxD"

set "ARCHIVE=%DEST%\!FOLDER!.7z"

:: 顯示進度及當前處理的資料夾
echo [%current%/%total%] ▷ 壓縮中:!FOLDER!

:: 執行壓縮,使用一般壓縮等級(-mx=5)
"%7ZEXE%" a -t7z -mx=5 "!ARCHIVE!" "!FULLPATH!\*" >nul

:: 檢查壓縮結果
if !errorlevel! equ 0 (
echo [%current%/%total%] ✓ 完成:!FOLDER!
) else (
echo [%current%/%total%] ✖ 錯誤:壓縮「!FOLDER!」時發生問題
)
echo.
)

:: 清理臨時檔案
del "%TEMPLIST%" >nul 2>&1

:: ===== 完成 =====
echo === ✅ 全部資料夾已壓縮完成 ===
echo 來源:%SOURCE%
echo 輸出:%DEST%
echo 共處理:%total% 個資料夾
pause