在TotalCommander中調用7-zip命令列工具快速壓縮選擇的檔案、資料夾

  • 3449
  • 0
  • 2013-09-11

在TotalCommander中調用7-zip命令列工具快速壓縮選擇的檔案、資料夾

DotBlogs Tags: ,

工程師就愛做潛盾機,明明在 TotalCommander 中,選好檔案按住滑鼠右鍵,叫出功能選單,再移動滑去選壓縮、解壓縮命令,然後再輸入壓縮相關參數就完成了,說真的只是多按、多移動滑鼠,但我就懶咩,結果就搞了這玩意兒出來。

先看一下正常 UI 操作:

1. 選要壓縮的檔案。

2.按住滑鼠右鍵。

3. 滑鼠移到【7-Zip】命令上,跳出子功能表。

4. 滑鼠移到【加入壓縮檔】命令,用力按下去。

113008

5. 在對話視窗輸入壓縮名稱和相關壓縮參數,有可能需要設定密碼。

6. 按【確定】鈕,讓 7-Zip 開始壓縮。

113338

手續說多不多,說少也不少,但就想懶,所以想寫 Batch 檔,快速解決這事。為解決這件事,第一步當然要知道 7-Zip 的命令列說明,一開始是用 7z.exe 的內建命令說明,大概知道多檔案壓縮,是透過 @listfiles 的方式,但有點沒把握:

115757

孤狗一下,希望找到範例,最後我參考的是這篇文章: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 的說明檔就好:

120430

找到了 %L 這個參數,所以馬上來試一下。先寫好下面的 Batch 檔(tt.bat):

7z.exe a -t7z archive.7z %1

然後在 TotalCommander 的工具列加入一個新的項目,指向這個 Batch,參數給他 %L:

130018

接下來就測試看看囉!先選幾個檔案,然後按下工具列的按鈕,輸出一個 archive.7z。好像成功了喔,那我們來看一下壓縮檔內容:

130504

130242

嗯?怎麼只有一個檔案,而且我剛選的是好幾個圖檔和一個資料夾啊!解壓縮看一下 tmp 檔的內容吧:

130629

原來 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、預設壓縮檔名是「父資料夾名稱」等,有興趣的人可以自己調整。

--------
沒什麼特別的~
不過是一些筆記而已