PowerShellでZIPへの圧縮や解凍する方法

2024年10月15日 Posted 野々瀨(フロントエンドエンジニア)

今回はWindowsのPowerShellで、ZIPへの圧縮や解凍を行う方法をご紹介します。

コマンドプロンプトではできないの?

残念ながらコマンドプロンプトあるいはバッチファイルでは、直接ZIPの操作を行うことはできません。
直接はZIP操作できないものの、例えばコマンドプロンプトあるいはバッチファイルからPowerShellを実行したり、7-Zipなどコマンドラインで操作可能なアプリケーションを使用したりすることで、直接ではないもののZIP処理することは可能といえば可能です。

ちなみにWindow10からWSL(Windows Subsystem for Linux)というLinuxのシステムをWindowsで実行することのできる仕組みがあります。
WSLを使用することでLinuxコマンドが扱えるようになりますので、zipコマンドが使用できるようになります。
ただし、WSL自体は有効化またはインストールする必要があります。

PowerShellでのZIP操作

PowerShellで操作行うには、Microsoft.PowerShell.Archiveモジュールの機能を使用します。
圧縮を行うためのコマンドレットCompress-Archiveと、解凍を行うためのコマンドレットExpand-Archiveを使用することができます。

圧縮

ファイルまたはディレクトリーの圧縮を行うには、コマンドレットCompress-Archiveを使用します。
-Pathパラメーターで圧縮するファイルまたはディレクトリーパス、-DestinationPathパラメーターで出力ファイルパスを指定します。
ファイルパスは相対パスでも絶対パスでもどちらでも問題ありません。

ファイル:

Compress-Archive -Path ~/foo.txt -DestinationPath C:/archives/foo.zip

ディレクトリー:

Compress-Archive -Path ~/foo -DestinationPath C:/archives/foo.zip

ワイルドカードで指定することも可能です。

Compress-Archive -Path ~/foo/* -DestinationPath C:/archives/foo.zip

コンマ区切りで指定することで、複数指定することも可能です。

Compress-Archive -Path ~/foo.txt,~/bar/* -DestinationPath C:/archives/foo.zip

圧縮元のファイルやディレクトリーが存在していなかったり、出力先のディレクトリーが存在していなかったりするとエラーになり失敗します。

また、出力ファイルが既に存在していた場合もエラーになり失敗します。
上書きしたい場合は-Forceパラメーターを指定します。

Compress-Archive -Force -Path ~/foo.txt -DestinationPath C:/archives/foo.zip

-Forceパラメーターは上書きなので、出力ファイル自体置き換わります。
上書きではなく、追加したい場合は-Updateパラメーターを指定します。

Compress-Archive -Update -Path ~/foo.txt -DestinationPath C:/archives/foo.zip
パラメーター必須説明
-CompressionLevel 圧縮率。指定可能な値はFastestNoCompressionOptimalの3種類。
-Confirm 実行前に確認メッセージを表示する。
-DestinationPath 圧縮したファイルを保存する出力先のファイルパス。
-Force 出力先のファイル(-DestinationPathで指定したパス)が既に存在する場合に上書きする。
-LiteralPath 圧縮するファイルまたはディレクトリーのパス。
ワイルドカードは使用できず、指定した文字そのままとして解釈する。
複数指定する場合は、コンマ区切りで指定する(パス,パス...)。
-PassThru 出力したZIPファイルのファイルオブジェクトを返す。
-Path 圧縮するファイルまたはディレクトリーのパス。
ワイルドカードが使用可能。
複数指定する場合は、コンマ区切りで指定する(パス,パス...)。
-Update -DestinationPathで指定したファイルパスに追加する。
-WhatIf 処理を実行せず、処理が実行された場合の内容を返す。

圧縮率:

指定可能値既定値説明
Fastest 圧縮するが処理時間を優先して処理。
NoCompression 圧縮を行わない。
Optimal 最適な圧縮率で処理。

解凍

ZIPファイルを解凍するには、コマンドレットExpand-Archiveを使用します。
-PathパラメーターでZIPファイルのパス、-DestinationPathパラメーターで解凍先のディレクトリーパスを指定します。
ファイルパスは相対パスでも絶対パスでも、どちらでも問題ありません。

Expand-Archive -Path ~/foo.zip -DestinationPath C:/tmp

ワイルドカードで指定することも可能です。

Expand-Archive -Path ~/bar/* -DestinationPath C:/tmp

解凍先に既に存在していた場合はエラーになり失敗します。
上書きしたい場合は-Forceパラメーターを指定します。

Expand-Archive -Force -Path ~/foo.zip -DestinationPath C:/tmp
パラメーター必須説明
-Confirm 実行前に確認メッセージを表示する。
-DestinationPath 解凍先のディレクトリーパス。
-Force 解凍先のファイルやディレクトリーが既に存在する場合に上書きする。
-LiteralPath 解凍するZIPファイルのパス。
ワイルドカードは使用できず、指定した文字そのままとして解釈する。
-PassThru 解凍されたファイルの一覧を出力する。
-Path 解凍するZIPファイルのパス。
-WhatIf 処理を実行せず、処理が実行された場合の内容を返す。

パスワード付きZIPについて

PowerShellでZIPの圧縮や解凍を行うことができますが、残念ながらパスワード付きの圧縮や解凍を行うことはできません。
7-Zipなどのアプリケーションを使用するか、WSLのzipコマンドを使用することでパスワード付きZIPを扱うことができます。

cd "C:/Program Files/7-Zip"
7z.exe a -p1234567890 C:/Users/Taro/foo.zip C:/Users/Taro/foo.txt

コマンドプロンプトでPowerShellを実行

powershellコマンドを使用しますと、コマンドプロンプトでPowerShellを扱うことができます。

powershell Compress-Archive -Path ~/foo.txt -DestinationPath C:/archives/foo.zip

参考リンク