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
GrCa版本
@echo off
:: 啟用 UTF-8 編碼以支援日文、中文等 Unicode 字元
chcp 65001 >nul
:: 啟用延遲變數展開
setlocal enabledelayedexpansion

:: === 設定基本參數 ===
set "SOURCE=E:\E-Download" :: 來源資料夾
set "DEST=E:\E-Downloadzip" :: 輸出資料夾
set "7ZEXE=C:\Program Files\7-Zip\7z.exe" :: 7-Zip 執行檔路徑
set "LOG=%DEST%\compression_log.txt" :: 日誌檔案

:: === 檢查環境 ===
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%"
)

:: === 計算總資料夾數量 ===
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"
set "ARCHIVE=%DEST%\!FOLDER!.7z"

:: 檢查目標檔案是否已存在
set "COUNTER=0"
set "BASE_NAME=%DEST%\!FOLDER!.7z"
set "ARCHIVE=!BASE_NAME!"
:CHECK_DUPLICATE
if exist "!ARCHIVE!" (
set /a COUNTER+=1
set "ARCHIVE=%DEST%\!FOLDER!_!COUNTER!.7z"
goto CHECK_DUPLICATE
)

:: 檢查資料夾是否為空
dir "!FULLPATH!\*" /a-d >nul 2>&1
if !errorlevel! equ 0 (
echo [%current%/%total%] ▷ 壓縮中:!FOLDER! >> "%LOG%"
echo [%current%/%total%] ▷ 壓縮中:!FOLDER!
"%7ZEXE%" a -t7z -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