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 |
圧縮率。指定可能な値はFastest 、NoCompression 、Optimal の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