【PowerShell】ZIPファイルを圧縮・解凍する方法|Compress-Archive・Expand-Archive

【PowerShell】ZIPファイルを圧縮・解凍する方法|Compress-Archive・Expand-Archive PowerShell

WindowsでZIPファイルを作ったり展開したりする作業は、PowerShellならCompress-Archive(圧縮)とExpand-Archive(解凍)のコマンドだけで完結します。どちらもPowerShell 5.0以降に標準で入っているため、追加のソフトは不要です。バックアップの自動化や、大量ファイルのまとめ送付などに役立ちます。

つまずきやすいのは、同じ名前のZIPがすでにあると、上書きに-Forceが必要になること、そして-Pathにフォルダを指定するか、フォルダの中身(\*)を指定するかで、ZIPの構造が変わることです。この記事では、実機のPowerShell 5.1で確認しながら、ZIPの圧縮・解凍を整理します。

先に結論

  • 圧縮はCompress-Archive -Path 対象 -DestinationPath 出力.zipです。
  • 解凍はExpand-Archive -Path 入力.zip -DestinationPath 出力先です。
  • 同名のZIPがあると上書きに-Forceが必要です(無いとエラー)。
  • -Path フォルダはフォルダごと、-Path フォルダ\*は中身だけを圧縮します。
  • 既存ZIPへの追加は-Update、圧縮率は-CompressionLevelで指定します。
  • PowerShell 5.0以降に標準搭載。追加ソフトは不要です。

対象ファイルの確認や準備はファイル・フォルダ操作(Test-Path・Get-ChildItem)、圧縮対象の絞り込みはWhere-Object・Select-Object、エラー時の対処はtry-catchでのエラー処理もあわせて参考になります。

スポンサーリンク

ZIPに圧縮する Compress-Archive

もっとも基本的な圧縮は、Compress-Archive圧縮したい対象(-Path出力するZIPファイル名(-DestinationPathを渡すだけです。

基本の圧縮
# 1つのファイルをZIPにする
Compress-Archive -Path "C:\data\report.txt" -DestinationPath "C:\data\report.zip"

# フォルダ内の .txt をまとめてZIPにする(ワイルドカード)
Compress-Archive -Path "C:\data\*.txt" -DestinationPath "C:\data\texts.zip" 

実機でも、Compress-Archive -Path "*.txt" -DestinationPath "out.zip"でZIPファイルが作成されました。-Pathにはファイル1つだけでなく、*.txtのようなワイルドカードも指定でき、条件に合うファイルをまとめて圧縮できます。-DestinationPathの拡張子は.zipにします。

複数ファイル・フォルダを圧縮する

複数のファイルやフォルダをまとめて1つのZIPにするには、-Pathカンマ区切りで並べます。配列として渡すこともできます。

複数指定
# 複数のファイル・フォルダをまとめて圧縮
Compress-Archive -Path "C:\data\report.txt", "C:\data\logs" -DestinationPath "C:\backup.zip"

# 配列にまとめてから渡してもよい
$targets = "C:\data\a.txt", "C:\data\b.txt", "C:\data\img"
Compress-Archive -Path $targets -DestinationPath "C:\backup.zip" 

カンマで区切れば、ファイルとフォルダを混在させて指定できます。たくさんの対象を扱うときは、いったん変数(配列)にまとめてから-Pathに渡すと、コードが読みやすくなります。

-Path フォルダ と フォルダ\* の違い

ここが重要な注意点です。フォルダを圧縮するとき、-Path フォルダと書くか、-Path フォルダ\*と書くかで、ZIPの中身の構造が変わります

フォルダ指定の違い
# (A) フォルダそのものを指定 → ZIPの中に「src」フォルダごと入る
Compress-Archive -Path "C:\work\src" -DestinationPath "folder.zip"
#   解凍すると: src\a.txt, src\b.txt(srcフォルダが残る)

# (B) フォルダの中身を指定(\*)→ ZIPの直下にファイルが入る
Compress-Archive -Path "C:\work\src\*" -DestinationPath "contents.zip"
#   解凍すると: a.txt, b.txt(srcフォルダは付かない)
フォルダごとか、中身だけか

実機で確認したところ、-Path "src"で圧縮したZIPを解凍するとsrc\a.txtのようにsrcフォルダごと展開され、-Path "src\*"で圧縮したZIPを解凍するとa.txtのように中身だけが直下に展開されました。「解凍したらフォルダが二重になってしまった」「逆にフォルダにまとまっていてほしかった」というトラブルは、たいていこの違いが原因です。フォルダ構造を保ちたいならフォルダ、中身だけ取り出したいならフォルダ\*と、目的に合わせて使い分けてください。

既存のZIPは -Force が必要

すでに同じ名前のZIPファイルがある状態でCompress-Archiveを実行すると、エラーになります。上書きしたいときは-Forceを付けます。

上書きには -Force
# 同名のZIPが既にあると、そのままではエラー
Compress-Archive -Path "*.txt" -DestinationPath "out.zip"
# エラー: アーカイブ ファイル ... は既に存在します

# 上書きするなら -Force を付ける
Compress-Archive -Path "*.txt" -DestinationPath "out.zip" -Force

実機でも、既存のout.zipに対して-Forceなしで再圧縮するとエラーになり、-Forceを付けると上書きできました。定期的にバックアップZIPを作り直すスクリプトなどでは、-Forceを付けておかないと2回目以降が失敗するので注意します。

既存ZIPに追加する -Update

既存のZIPを上書きするのではなく、ファイルを追加・更新したいときは-Updateを使います。ZIP内の同名ファイルは新しいものに置き換わり、無いファイルは追加されます。

追加・更新は -Update
# 既存の contents.zip に c.txt を追加する
Compress-Archive -Path "c.txt" -DestinationPath "contents.zip" -Update
#   結果: a.txt, b.txt, c.txt(既存の中身は保たれ、c.txt が増える)

実機でも、a.txtb.txtが入ったZIPに-Updatec.txtを追加すると、a.txt, b.txt, c.txtの3つになりました。-ForceがZIP全体を作り直すのに対し、-Updateは中身を保ったまま追加・更新する点が違います。少しずつファイルを足していきたいときに便利です。

圧縮率を指定する CompressionLevel

圧縮の強さは-CompressionLevelで指定できます。Optimal(標準・最も縮む)、Fastest(速い)、NoCompression(圧縮なし)の3段階です。

圧縮率の指定
# 標準(指定しない場合もこれ。圧縮率優先)
Compress-Archive -Path "*.log" -DestinationPath "logs.zip" -CompressionLevel Optimal

# 速度優先(圧縮率は下がるが速い)
Compress-Archive -Path "*.log" -DestinationPath "logs.zip" -CompressionLevel Fastest -Force

# 圧縮しない(まとめるだけ)
Compress-Archive -Path "*.log" -DestinationPath "logs.zip" -CompressionLevel NoCompression -Force

実機でも、-CompressionLevel Fastestを指定したZIPが作成できました。指定しない場合はOptimal(圧縮率優先)になります。大量のファイルを素早くまとめたいならFastest、すでに圧縮済みの画像や動画をまとめるだけならNoCompression、というように使い分けます。

ZIPを解凍する Expand-Archive

解凍はExpand-ArchiveZIPファイル(-Path展開先フォルダ(-DestinationPathを渡します。

基本の解凍
# ZIPを指定フォルダに解凍する
Expand-Archive -Path "C:\data\report.zip" -DestinationPath "C:\data\unzipped"

# -DestinationPath を省略すると、カレントディレクトリに同名フォルダで展開される
Expand-Archive -Path "C:\data\report.zip" 

実機でも、Expand-Archive -Path "out.zip" -DestinationPath "unzipped"で、ZIPの中身がunzippedフォルダに展開されました。-DestinationPathを省略した場合は、カレントディレクトリ(現在の作業場所)に、ZIPと同じ名前のフォルダが作られてそこに展開されます。実機でも、作業場所をwork2にしてsolo.zipを省略形で解凍すると、ZIPの場所ではなくwork2\solo\に展開されることを確認しました。意図しない場所に展開されないよう、-DestinationPathは明示するのが安全です。

また、-DestinationPathを省略すると展開先がカレントディレクトリ任せになるため、スクリプトでは展開先を必ず指定しておくと、どこで実行しても結果が安定します。

解凍時も -Force で上書き

展開先にすでに同じファイルがあると、Expand-Archiveエラーになります。上書きして展開したいときは、圧縮と同じく-Forceを付けます。

解凍の上書き
# 展開先に同名ファイルがあると、そのままではエラー
Expand-Archive -Path "out.zip" -DestinationPath "unzipped"

# 上書きして展開するなら -Force
Expand-Archive -Path "out.zip" -DestinationPath "unzipped" -Force

実機でも、すでに展開済みのフォルダに対して-Forceなしで再解凍するとエラーになり、-Forceを付けると上書きできました。同じ場所に繰り返し展開するスクリプトでは、-Forceを付けておくと安全です。

主なパラメータ一覧

Compress-ArchiveExpand-Archiveでよく使うパラメータをまとめます。

パラメータ コマンド 働き
-Path 両方 対象(圧縮元 / 解凍するZIP)
-DestinationPath 両方 出力先(ZIP / 展開先フォルダ)
-Force 両方 既存があっても上書きする
-Update Compress 既存ZIPに追加・更新する
-CompressionLevel Compress 圧縮率(Optimal / Fastest / NoCompression)

日本語ファイル名・パスワードの注意

日本語を含むファイル名は、PowerShellのCompress-ArchiveExpand-Archiveの組み合わせなら正しく扱えます。実機でも、レポート.txtのような日本語名のファイルを圧縮・解凍して、名前が元どおりになることを確認しました。

他ツールとの相性・パスワードは要注意

PowerShell同士の圧縮・解凍では日本語ファイル名も正しく往復しますが、作成したZIPを別のツールや環境で開くと、日本語名が文字化けして見える場合があります。配布先での互換性が重要なときは、7-Zipなどの専用ツールを使うと確実です。また、Compress-Archiveにはパスワード(暗号化)を設定する機能がありません。パスワード付きZIPが必要な場合も、7-Zipや専用モジュールを利用してください。大きなフォルダや非常に多くのファイルを扱う場合、Compress-Archiveは専用ツールより遅くなることがある点も覚えておくとよいです。

よくある失敗

既存ZIPに-Forceを付けず実行する

同名のZIPがあるとエラーになります。上書きするなら-Force、追加するなら-Updateを使います。

フォルダ指定で構造が思い通りにならない

-Path フォルダはフォルダごと、-Path フォルダ\*は中身だけです。目的に合わせて使い分けます。

解凍先に既存ファイルがあってエラーになる

Expand-Archiveも上書きには-Forceが必要です。

拡張子を.zip以外にしてしまう

-DestinationPathのZIPファイル名は.zipにします。

パスワード付きZIPを作ろうとする

Compress-Archiveに暗号化機能はありません。7-Zipなどを使います。

よくある質問

QフォルダをZIPに圧縮するには?
ACompress-Archive -Path "フォルダのパス" -DestinationPath "出力.zip"で圧縮できます。フォルダごとZIPに入れたいときは-Path "フォルダ"、フォルダの中身だけを直下に入れたいときは-Path "フォルダ\*"と指定します。
Q同名のZIPがあるとエラーになります。
ACompress-Archiveは既存の同名ZIPがあるとエラーになります。上書きするなら-Force、既存の中身を残して追加するなら-Updateを付けてください。解凍するExpand-Archiveも、上書きには-Forceが必要です。
QZIPを解凍するには?
AExpand-Archive -Path "入力.zip" -DestinationPath "展開先フォルダ"で解凍できます。-DestinationPathを省略すると、ZIPと同じ場所に同名のフォルダが作られて展開されます。
Q圧縮の速度を上げたいです。
A-CompressionLevel Fastestを指定すると、圧縮率は下がりますが速く処理できます。すでに圧縮済みの画像や動画をまとめるだけならNoCompressionも使えます。指定しない場合は圧縮率優先のOptimalになります。
Qパスワード付きのZIPは作れますか?
ACompress-Archiveにはパスワード(暗号化)機能がありません。パスワード付きZIPが必要な場合は、7-Zipなどの専用ツールや、対応するPowerShellモジュールを利用してください。日本語ファイル名の他ツールとの互換性が重要な場合も、7-Zipが確実です。

まとめ

  • 圧縮はCompress-Archive -Path 対象 -DestinationPath 出力.zip
  • 解凍はExpand-Archive -Path 入力.zip -DestinationPath 出力先
  • 既存のZIPやファイルを上書きするには-Forceが必要です。
  • -Path フォルダはフォルダごと、フォルダ\*は中身だけを圧縮します。
  • 追加は-Update、圧縮率は-CompressionLevelで調整します。
  • パスワード付きZIPは作れないため、必要なら7-Zipなどを使います。

PowerShellのCompress-ArchiveExpand-Archiveを使えば、追加ソフトなしでZIPの圧縮・解凍を自動化できます。とくに「上書きには-Force」「フォルダ指定はフォルダフォルダ\*か」の2点を押さえれば、バックアップやファイル整理のスクリプトをつまずかずに書けます。