介紹如何使用 PowerShell 指令稿,自動壓縮與解壓縮 Zip 壓縮檔,並提供常用的範例程式碼。
在第五版之後的 PowerShell 本身就有支援 Zip 壓縮檔的壓縮功能,我們可以利用 Compress-Archive
指令來壓縮檔案或目錄:
# 建立 Zip 壓縮檔 Compress-Archive -Path D:\MyFolder -DestinationPath D:\MyArchive.zip
這樣 PowerShell 就會將 D:\MyFolder
這整個目錄壓縮成 D:\MyArchive.zip
這個壓縮檔。
如果要分開指定多個檔案,可以用逗號分隔:
# 壓縮多個檔案 Compress-Archive -Path D:\MyFolder\MyFile.docx, D:\MyFolder\MyImg.jpg -DestinationPath D:\MyArchive.zip
如果要更新壓縮檔,可以加上 -Update
參數:
# 更新壓縮檔 Compress-Archive -Path D:\MyFolder\*.txt -Update -DestinationPath D:\MyArchive.zip
執行之後,PowerShell 比對 D:\MyArchive.zip
與 D:\MyFolder\*.txt
中的檔案,將有更新的檔案加入 D:\MyArchive.zip
壓縮檔中,而若有新增的檔案也會一併加入。
壓縮層級會影響壓縮所耗費的時間,以及所產生的壓縮檔大小,我們可以使用 -CompressionLevel
參數來指定壓縮層級,可用的選項如下。
層級 | 說明 |
---|---|
Fastest |
使用最快速的方式壓縮,這種方式會產生較大的壓縮檔。 |
NoCompression |
不要進行壓縮。 |
Optimal |
最佳壓縮,產生的壓縮檔較小,需要的時間跟檔案大小有關。此方式為預設值。 |
若要減少壓縮所耗費的時間,可以使用 Fastest
的壓縮方式:
# 建立 Zip 壓縮檔 Compress-Archive -Path D:\MyFolder -CompressionLevel Fastest -DestinationPath D:\MyArchive.zip
Compress-Archive
在使用 -Path
參數指定路徑時,某些萬用字元位有特殊意義(例如 *
代表任意的字元),如果想讓 PowerShell 直接根據字面上的文字解譯,不要有任何特殊意義,可以改用 -LiteralPath
:
# 不使用萬用字元 Compress-Archive -LiteralPath D:\奇怪的檔名.docx -DestinationPath D:\MyArchive.zip
通常在大部分的情況下使用 -Path
即可,當遇到比較奇怪的檔名時,才會需要用到 -LiteralPath
。
如果在建立壓縮檔時,目標的 Zip 壓縮檔已經存在的話,Compress-Archive
就會顯示錯誤訊息,如果想要強制讓它覆蓋舊的 Zip 壓縮檔的話,可以加上 -Force
參數:
# 強制建立 Zip 壓縮檔 Compress-Archive -Path D:\MyFolder -Force -DestinationPath D:\MyArchive.zip
若要在第五版之後的 PowerShell 中解壓縮 Zip 檔案,可以使用 Expand-Archive
指令:
# 解壓縮 Zip 檔 Expand-Archive -Path D:\MyArchive.Zip -DestinationPath D:\Output
執行之後就會將 D:\MyArchive.Zip
解壓縮至 D:\Output
目錄中,如果 D:\Output
目錄不存在的話,解壓縮時它會自動建立。
若要 PowerShell 直接根據字面上的文字解譯檔案名稱,可以使用 -LiteralPath
參數來指定檔名:
# 不使用萬用字元 Expand-Archive -LiteralPath D:\奇怪的檔名.Zip -DestinationPath D:\Output
如果在解壓縮的目的目錄中,已經存在有壓縮檔中的檔案,則解壓縮時就會出錯,若要強制覆蓋舊檔,可以加上 -Force
參數:
# 強制解壓縮 Zip 檔 Expand-Archive -Path D:\MyArchive.Zip -Force -DestinationPath D:\Output
參考資料:StackOverflow、Sysadmins of the North、StackOverflow、StackOverflow