在TotalCommander中調用7-zip命令列工具快速壓縮選擇的檔案、資料夾
工程師就愛做潛盾機,明明在 TotalCommander 中,選好檔案按住滑鼠右鍵,叫出功能選單,再移動滑去選壓縮、解壓縮命令,然後再輸入壓縮相關參數就完成了,說真的只是多按、多移動滑鼠,但我就懶咩,結果就搞了這玩意兒出來。
先看一下正常 UI 操作:
1. 選要壓縮的檔案。
2.按住滑鼠右鍵。
3. 滑鼠移到【7-Zip】命令上,跳出子功能表。
4. 滑鼠移到【加入壓縮檔】命令,用力按下去。
5. 在對話視窗輸入壓縮名稱和相關壓縮參數,有可能需要設定密碼。
6. 按【確定】鈕,讓 7-Zip 開始壓縮。
手續說多不多,說少也不少,但就想懶,所以想寫 Batch 檔,快速解決這事。為解決這件事,第一步當然要知道 7-Zip 的命令列說明,一開始是用 7z.exe 的內建命令說明,大概知道多檔案壓縮,是透過 @listfiles 的方式,但有點沒把握:
孤狗一下,希望找到範例,最後我參考的是這篇文章:7-zip-examples。總之,我們現在知道多檔案壓縮其實就是把檔案名稱用參數方式,全串在一此給 7-Zip 就可以了,例如:
D:\temp\Workshop>7z.exe a -t7z archive.7z favicon.ico Helpers Global.asax.cs 7-Zip [64] 9.20 Copyright (c) 1999-2010 Igor Pavlov 2010-11-18 Scanning Creating archive archive.7z Compressing favicon.ico Compressing Global.asax.cs Compressing Helpers\WebSiteHelper.cs Everything is Ok
所以第二步,要查 TotalCommander 怎麼輸出我所選擇的檔案、資料夾清單。這個倒簡單,看 TotalCommander 的說明檔就好:
找到了 %L 這個參數,所以馬上來試一下。先寫好下面的 Batch 檔(tt.bat):
7z.exe a -t7z archive.7z %1
然後在 TotalCommander 的工具列加入一個新的項目,指向這個 Batch,參數給他 %L:
接下來就測試看看囉!先選幾個檔案,然後按下工具列的按鈕,輸出一個 archive.7z。好像成功了喔,那我們來看一下壓縮檔內容:
嗯?怎麼只有一個檔案,而且我剛選的是好幾個圖檔和一個資料夾啊!解壓縮看一下 tmp 檔的內容吧:
原來 TotalCommander 的 %L 變數,是把選擇的檔案寫到暫存檔再餵給指定的程式。查了一下 7-Zip 的說明,看起來沒有可以吃檔案的參數,所以要想辦法把這份清單轉成空白分格的字串才行,所以我用以下的方式轉換:
for /F %%i IN (%1) DO call :concat %%i :concat set list=%list% %1 goto :eof
以下是最後的 Leo 客製化 Batch 檔:
@echo off set /p compressType=選擇壓縮格式{ 1(7z), 2(zip), 3(zzz-password)}(Default=1) : if "%compressType%" == "" set compressType=1 set /p archiveName=輸入壓縮檔名(不含副檔名)(Default=父資料夾名稱): if "%archiveName%" == "" call :getLastFolderName %2 for /F %%i IN (%1) DO call :concat %%i if "%compressType%" == "1" call :compressNoPassword 7z if "%compressType%" == "2" call :compressNoPassword zip if "%compressType%" == "3" call :setPassword zzz goto :end :compressNoPassword @echo on 7z.exe a -t%1 %archiveName%.%1 %list% -mx9 @echo off goto :eof :compressPassword @echo on 7z.exe a -t%1 %archiveName%.zzz %list% -mx9 -p%2 @echo off goto :eof :concat set list=%list% %1 goto :eof :setPassword set /p password=請輸入密碼: call :compressPassword zip %password% goto :eof :getLastFolderName set mydir="%~p1" SET mydir=%mydir:\=;% for /F "tokens=* delims=;" %%i IN (%mydir%) DO call :LAST_FOLDER %%i goto :EOF :LAST_FOLDER if "%1"=="" ( rem echo %archiveName% goto :EOF ) set archiveName=%1 SHIFT goto :LAST_FOLDER :end rem pause
上述 Batch 檔是屬於我個人客製化版本,包含:用 Zip 格式壓縮且加密但副檔名是 zzz、預設壓縮檔名是「父資料夾名稱」等,有興趣的人可以自己調整。
--------
沒什麼特別的~
不過是一些筆記而已