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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
GrCa ZIP版本(Grok)
@echo off
:: 啟用 UTF-8 編碼以支援日文、中文等 Unicode 字元,避免名稱亂碼
chcp 65001 >nul

:: 啟用延遲變數展開,以正確處理動態變數(如 !FOLDER!)
setlocal enabledelayedexpansion

:: === 設定基本參數 ===
:: 來源資料夾:指定要壓縮的資料夾路徑
set "SOURCE=E:\E-Download"
:: 目標資料夾:壓縮檔案的輸出路徑
set "DEST=E:\E-Downloadzip"
:: 7-Zip 可執行檔路徑
set "7ZEXE=C:\Program Files\7-Zip\7z.exe"
:: 日誌檔案:記錄壓縮過程和錯誤訊息
set "LOG=%DEST%\compression_log.txt"

:: === 檢查環境 ===
:: 檢查 7-Zip 是否存在
if not exist "%7ZEXE%" (
echo [✖] 錯誤:找不到 7-Zip 程式於「%7ZEXE%」 >> "%LOG%"
echo [✖] 錯誤:找不到 7-Zip 程式於「%7ZEXE%」
pause
exit /b 1
)

:: 檢查來源資料夾是否存在
if not exist "%SOURCE%" (
echo [✖] 錯誤:來源資料夾不存在「%SOURCE%」 >> "%LOG%"
echo [✖] 錯誤:來源資料夾不存在「%SOURCE%」
pause
exit /b 1
)

:: === 建立輸出資料夾 ===
:: 如果目標資料夾不存在,則自動建立
if not exist "%DEST%" (
echo [!] 建立輸出資料夾:%DEST% >> "%LOG%"
echo [!] 建立輸出資料夾:%DEST%
mkdir "%DEST%"
if errorlevel 1 (
echo [✖] 錯誤:無法建立輸出資料夾:%DEST% >> "%LOG%"
echo [✖] 錯誤:無法建立輸出資料夾:%DEST%
pause
exit /b 1
)
)

:: === 計算總資料夾數量 ===
:: 使用 PowerShell 計算資料夾數量,供進度顯示使用
set /a total=0
for /f "usebackq delims=" %%A in (`powershell -nologo -command ^
"Get-ChildItem -Path '%SOURCE%' -Directory | Sort-Object CreationTime | ForEach-Object { $_.FullName }"`) do set /a total+=1
echo [i] 找到 %total% 個資料夾需要壓縮。 >> "%LOG%"
echo [i] 找到 %total% 個資料夾需要壓縮。

:: === 開始壓縮 ===
:: 記錄壓縮開始時間
echo [*] %date% %time% 開始壓縮作業 >> "%LOG%"
set /a current=0
for /f "usebackq delims=" %%F in (`powershell -nologo -command ^
"Get-ChildItem -Path '%SOURCE%' -Directory | Sort-Object CreationTime | ForEach-Object { $_.FullName }"`) do (
set /a current+=1
:: 取得資料夾完整路徑
set "FULLPATH=%%F"
:: 取得資料夾名稱(不含路徑),保留原始名稱(包含特殊字元)
set "FOLDER=%%~nxF"
:: 設定壓縮檔案名稱,使用 .zip 格式
set "ARCHIVE=%DEST%\!FOLDER!.zip"

:: 檢查目標檔案是否已存在,若存在則添加序號(如 _1, _2)避免覆蓋
set "COUNTER=0"
set "BASE_NAME=%DEST%\!FOLDER!.zip"
set "ARCHIVE=!BASE_NAME!"
:CHECK_DUPLICATE
if exist "!ARCHIVE!" (
set /a COUNTER+=1
set "ARCHIVE=%DEST%\!FOLDER!_!COUNTER!.zip"
goto CHECK_DUPLICATE
)

:: 檢查資料夾是否為空,僅壓縮包含檔案的資料夾
dir "!FULLPATH!\*" /a-d >nul 2>&1
if !errorlevel! equ 0 (
:: 顯示進度並執行壓縮,使用 .zip 格式,一般壓縮等級 (-mx=5)
echo [%current%/%total%] ▷ 壓縮中:!FOLDER! >> "%LOG%"
echo [%current%/%total%] ▷ 壓縮中:!FOLDER!
"%7ZEXE%" a -tzip -mx=5 "!ARCHIVE!" "!FULLPATH!\*" >> "%LOG%" 2>&1
if !errorlevel! equ 0 (
echo [%current%/%total%] ✓ 完成:!FOLDER! >> "%LOG%"
echo [%current%/%total%] ✓ 完成:!FOLDER!
) else (
echo [%current%/%total%] ✖ 錯誤:壓縮「!FOLDER!」時發生問題 >> "%LOG%"
echo [%current%/%total%] ✖ 錯誤:壓縮「!FOLDER!」時發生問題
)
) else (
:: 資料夾為空,跳過壓縮
echo [%current%/%total%] [-] 跳過:!FOLDER! 是空的 >> "%LOG%"
echo [%current%/%total%] [-] 跳過:!FOLDER! 是空的
)
echo.
)

:: === 完成 ===
:: 記錄壓縮結束時間並顯示總結
echo [*] %date% %time% 全部資料夾壓縮完成 >> "%LOG%"
echo === ✅ 全部資料夾已壓縮完成 ===
echo 來源:%SOURCE%
echo 輸出:%DEST%
echo 共處理:%total% 個資料夾
pause