我們最近幾年幾乎所有案子都導入 CI/CD,把所有能自動化的工作全部都指令化,所以只要公司需要開發時期用的測試機,或是客戶需要安裝主機,通常都可以在 10 分鐘內搞定所有環境與設定。今天這篇文章我要來分享幾個常用的 7-Zip 命令與參數,因為 7-Zip 在第一次使用 7z
命令的時候,他的使用方式比較沒那麼直覺,所以寫成文章供未來查表參考之用。
安裝 7-Zip 工具
一如往常的,我幾乎都使用 Chocolatey 進行安裝 7-Zip 套件:
choco install 7zip -y
請注意要輸入 7zip
才是正確的套件名稱喔,這裡的 7
與 zip
中間不能加上 Dash 符號 (-
)!
你也可以用微軟最近推出的 Windows Package Manager CLI 安裝 7-Zip 工具
winget install 7zip
Windows Package Manager 1.0 | Windows Command Line
常用的壓縮檔案命令與參數
-
壓縮整個資料夾,而且壓縮檔案中的第一層就是該資料夾
這意味著壓縮檔中第一層目錄中沒有檔案,只有一個資料夾!
會這樣壓縮,通常是因為「解壓縮的人」經常會使用「解壓縮到這裡」的方式進行解壓縮,如果他把壓縮檔放在「桌面」上,解壓縮的時候就會看到桌面上只有一個檔案,看起來比較乾淨。
壓縮 dir1\
資料夾下所有檔案,而且壓縮檔案中會看到 dir1
這個資料夾!
7z a "dir1.zip" "dir1\"
如果你用以下命令壓縮,將會在壓縮檔中看到 dir1
與 dir2
資料夾等路徑!
7z a "dir1.zip" "dir1\dir2\"
7-Zip 預設會壓縮該目錄與所有子目錄的所有檔案!
如果要壓縮成 *.7z
格式,不用特別下參數,直接設定好壓縮檔的副檔名即可,例如:
7z a "dir1.7z" "dir1\"
注意:7-Zip 支援 *.rar
的解壓縮,但不能使用 RAR 格式進行,因為 RAR 壓縮格式有專利保護!
-
壓縮整個資料夾,而且壓縮檔案中第一層就是該資料夾下所有檔案與子資料夾
我個人比較喜歡這樣壓縮檔案,許多雲端平台在上傳檔案部署的時候,也會要求要用這種方式壓縮才能正常部署。
壓縮 dir1\
資料夾下所有檔案,壓縮檔案不會看到 dir1
這個資料夾,只會看到裡面的檔案與子資料夾!
7z a "dir1.zip" "dir1\*"
如果你用以下命令壓縮,將會看不到 dir1
與 dir2
資料夾!
7z a "dir1.zip" "dir1\dir2\*"
不過,如果你只想壓縮單一檔案,而且也不希望看見目錄的話,一定要在路徑前面加上一個 .\
開頭!
7z a "dir1.zip" ".\dir1\filename.ext"
-
壓縮整個資料夾,並且保留現有檔案的完整路徑
由於 7-Zip 壓縮過的檔案不會保留「磁碟代號」,你唯一能做的只能保留「路徑」部份而已。
你可以先進入磁碟的根目錄,然後用上述第 1 種方法來壓縮檔案:
CD /D G:\
7z a "dir2.zip" "sub1\dir1\dir2"
-
只壓縮整個資料夾下的特定檔案類型
如果要壓縮限定特定類型的檔案,可以先加上 -r
參數,再加上不同的檔名樣式 (File Patterns) 就可以找出檔案並加入壓縮檔:
7z a "dir1.zip" "dir1\" -r "dir1\*.aspx"
7z a "dir1.zip" "dir1\" -r "dir1\*.aspx" "dir1\*.dll"
如果要排除特定類型的檔案不要進壓縮檔,可以這樣寫:
7z a dir1.zip "dir1\" "-xr!*.pdb" "-xr!web.config"
-
將目前資料夾下的所有檔案壓縮到上一層目錄
如果你想壓縮當前目錄,但是壓縮檔不要出現在本資料夾,可以這樣寫:
7z a "..\dir1.zip"
不加上任何參數,預設就是把當前目錄全部都壓縮起來,但請記得壓縮檔不要放在當前目錄下!
常用的解壓縮檔案命令與參數
-
解壓縮到當前目錄
請確保不會弄亂你的資料夾才能用這個方法,因為解出來的東西會跟壓縮檔放在一起!
7z x "dir1.zip"
-
解壓縮到指定輸出目錄
7z x "dir1.zip" -o"dir1"
請記得習慣在 -o
參數後面加上 "
雙引號,這樣就可以確保資料夾路徑中有空白字元也可以正常運作!
7z x "dir1.zip" -o"C:\Program Files\"
注意:在 -o
與 Path
中間不能有任何空白字元!
-
只解壓縮特定檔案類型到指定輸出目錄
以下這個解壓縮命令會保留這些檔案的路徑在指定輸出目錄!
7z x "dir1.zip" -o"dir1" -r "*.dll"
注意:7-Zip 並非使用 Windows 的 system wildcard parser,他並不會真的去比對有沒有這些系統檔案,而是傳入字串到 7z
命令中,讓 7-Zip 去比對所有檔案!
-
擷取特定檔案類型到指定輸出目錄
這裡不說「解壓縮」而說「擷取」是因為 7-Zip 有個參數 e
就是 Extract
(擷取) 的意思。這個參數最大的特點就是【取出的檔案不會保留壓縮檔中的目錄結構】,專門用來讓你取出壓縮檔案中的一個或多個檔案。
以下這個擷取命令會取出所有 *.js
檔案到指定輸出目錄!
7z e "dir1.zip" -o"dir1" -r "*.js"
如果壓縮檔中檔案很多,很有可能會遇到存在於不同目錄,但是檔名相同的狀況,此時就會出現檔名衝突問你要不要覆蓋的提示。如果不想提示直接覆蓋,可以加上 -y
參數:
7z e "dir1.zip" -o"dir1" -r "*.dll" -y
-
解壓縮時略過壓縮檔中的第一層目錄並指定輸出目錄
7-Zip 不像 tar
有 --strip-components=
這種強大的進階用法,所以使用上比較沒那麼靈活,需要搭配批次檔進行實作!
如果是 PowerShell 的話,可以直接這樣執行:
7z x .\MyWebsite.zip
cd "MyWebsite"
mv "*" "C:\Inetpub\wwwroot"
cd ..
rmdir "MyWebSite"
如果是 Command Prompt 的話,建議安裝 Chocolatey 上有個 UnxUtils 套件,裡面有超多好用的 Linux 常見命令的 Windows 版本,其中當然包含了 mv
命令!
choco install unxutils -y
其他 7-Zip 進階用法
-
壓縮檔案時包含解壓縮密碼
壓縮的時候設定一個密碼(-p
),解壓縮檔案的時候必須輸入!
7z a "dir1.zip" "dir1/" -p"1q2w3e4r"
壓縮的時候設定一個密碼(-p
),並且將壓縮檔的 Header 資訊一併加密,也就是連檔名都一起加密,開啟壓縮檔的時候就要先輸入密碼才知道內容!(僅支援 *.7z
壓縮檔格式)
7z a "dir1.7z" "dir1/" -p"1q2w3e4r" -mhe
解壓縮一個加密過的壓縮檔到指定輸出目錄
7z x "dir1.7z" -o"dir1/" -p"1q2w3e4r"
-
列出所有檔案清單
我們在自動化的過程中可能會需要先知道壓縮檔中有什麼檔案,此時可以利用 7z
的 l
(List) 命令達成這個目的。
7z l "dir1.zip"
-
顯示壓縮檔中完整的技術資訊
你可以從中看出每個檔案的完整資訊,包含 CRC 與各種檔案屬性的細節,非常 Geek 的內容
7z l "dir1.zip" -slt
-
連同壓縮 NTFS 的 alternate streams 資訊到壓縮檔中 (-sns
)
我在 2008 年有介紹過這個東西 ▶ 介紹好用工具:Streams 讓你瞭解神秘的 NTFS 檔案系統
壓縮檔案時包含 NTFS Alternate Streams
7z a a.wim -sns *.txt
7-Zip 解壓縮的時候預設就會包含 NTFS Alternate Streams 到檔案中
7z x a.wim
不想讓 7-Zip 解壓縮的時候包含 NTFS Alternate Streams 可以加上 -sns
參數
7z x a.wim -sns-
列出壓縮檔案內容時包含 NTFS Alternate Streams 資訊 (加上 -sns
參數)
7z l a.wim -sns
相關連結