【保存版】PowerShellでZIPアーカイブを作成・解凍する方法を徹底解説
PowerShellの機能を使えば、コマンドラインから簡単にZIPアーカイブの作成や解凍が行えます。PowerShell 5.0(Windows 10には標準でインストールされています)では、専用モジュール Microsoft.PowerShell.Archive が利用可能です。それ以前のバージョンのWindows環境では、.NET Frameworkの ZipFile クラスを使用してアーカイブ操作を行います。
Microsoft.PowerShell.Archiveモジュールのコマンドレット
Microsoft.PowerShell.Archiveモジュール(C:\Windows\System32\WindowsPowerShell\v1.0\Modules\Microsoft.PowerShell.Archive)には、以下の2つのコマンドレットのみが含まれています。
- Compress-Archive: ファイルやフォルダをZIP形式に圧縮する
- Expand-Archive: ZIPファイルを展開する
モジュールに含まれるコマンドレットは、次のコマンドで確認できます。
Get-Command -Module Microsoft.PowerShell.Archive | Format-Table -AutoSize
CommandType Name Version Source ----------- ---- ------- ------ Function Compress-Archive 1.0.1.0 Microsoft.PowerShell.Archive Function Expand-Archive 1.0.1.0 Microsoft.PowerShell.Archive
以下では、これらのコマンドレットを使ってPowerShellスクリプト内でZIPアーカイブを作成・展開する具体的な方法を紹介します。
Compress-ArchiveでZIPアーカイブを作成する
Compress-Archiveコマンドレットの基本構文は以下の通りです。
Compress-Archive [-Path] String[] [-DestinationPath] String [-CompressionLevel String] [-Update]
- Path: 圧縮対象のファイルまたはフォルダのパスを指定します
- DestinationPath: 作成するZIPファイルの保存先パスを指定します
- CompressionLevel: 圧縮レベルを指定します(NoCompression / Optimal / Fastest)
- Update: 既存のZIPアーカイブにファイルを追加・更新します
- Force: 同名のアーカイブが既に存在する場合に上書きします
圧縮レベルのオプションについて:
- Optimal — 圧縮率を優先した最適化
- Fastest — 処理速度を優先した最適化
- NoCompression — 圧縮を行わない
すでに圧縮済みのファイル(jpg、msi、mp3など)を1つのZIPファイルにまとめる場合は、NoCompressionを指定しましょう。無駄なCPU時間の消費を避けられます。
単一のファイルを圧縮する基本的なコマンド例:
Compress-Archive -Path "C:\Logs\WindowsUpdate.log" -DestinationPath C:\Archive\updatelog.zip -CompressionLevel Optimal
複数フォルダの中身(すべてのファイルとネストされたサブフォルダを含む)をまとめて圧縮することもできます。複数のファイルやフォルダを指定する場合は、名前をカンマで区切ります。
Compress-Archive -Path C:\Logs\,C:\Logs2\ -DestinationPath C:\Archive\logs-all.zip -CompressionLevel Optimal
特定の拡張子のファイルだけを圧縮することも可能です。たとえば、*.txtファイルだけをZIPにするには次のように実行します。
Compress-Archive -Path C:\Logs\*.txt -DestinationPath C:\Archive\logs-txt.zip –CompressionLevel Fastest
より複雑な条件でファイルを抽出したい場合は、Get-ChildItemコマンドレットと組み合わせます。次のスクリプトは、ディスク上の*.docxおよび*.xlsxファイルからサイズ上位10件を検索し、アーカイブに追加します。
Get-ChildItem c:\share\ITdept -Include *.xlsx –Recurse | sort -descending -property length | select -first 10 | Compress-Archive -DestinationPath C:\backup\itdeptdocs.zip
既存のZIPアーカイブに新しいファイルを追加するには、-Updateパラメータを使用します。
Compress-Archive -Path C:\Logs\,C:\logs2\ –Update -DestinationPath C:\Archive\logs-txt.zip
注意点: Microsoft.PowerShell.Archiveモジュールは内部的にSystem.IO.Compression.ZipArchiveクラスを使用しているため、基盤APIの制約により2GBを超えるファイルは圧縮できません。それより大きいファイルを圧縮しようとすると、次のようなエラーが発生します。
Exception calling "Write" with "3" argument(s): "Stream was too long." At C:\Windows\system32\WindowsPowerShell\v1.0\Modules\Microsoft.PowerShell.Archive\Microsoft.PowerShell.Archive.psm1:805 char:29 + ... $destStream.Write($buffer, 0, $numberOfBytesRead) + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [], MethodInvocationException + FullyQualifiedErrorId : IOException
Expand-ArchiveでZIPファイルを解凍する
ZIPファイルの展開には、Expand-Archiveコマンドレットを使用します。構文はCompress-Archiveとよく似ています。
Expand-Archive [-Path] String [-DestinationPath] String [-Force] [-Confirm]
たとえば、先ほど作成したZIPアーカイブを指定フォルダに解凍し、既存ファイルを上書きするには、次のように実行します。
Expand-Archive -Path C:\archive\logs-all.zip -DestinationPath c:\logs -Force
Microsoft.PowerShell.Archiveモジュールの制限事項
- 解凍せずにアーカイブの中身を確認することができない
- アーカイブから一部のファイルだけを取り出せない(必ず全体を展開する必要がある)
- zip以外のアーカイブ形式に対応していない
- ZIPアーカイブにパスワード保護を設定できない
より高度な操作が必要なケースでは、PowerShellスクリプト内でサードパーティ製ツールを使用します。代表的なものとして 7zip や 7Zip4Powershell モジュールがあります。
7Zip4Powershellモジュールをインストールし、パスワード付きZIPファイルを解凍する手順は以下の通りです。
Install-Module -Name 7Zip4Powershell Expand-7Zip -ArchiveFileName C:\Archive\Logs.zip -Password "p@ssd0rw" -TargetPath C:\Share\Logs
ZipFileクラスを使った圧縮・解凍(旧バージョンのWindows向け)
Windows 10やWindows Server 2016より前の古いWindows環境で、PowerShellのバージョンが5.0未満の場合(アップグレードが難しい場合)、.NET Framework 4.5に含まれるZipFileクラスを使用してZIPアーカイブを作成できます。
まず、PowerShellセッションにクラスを読み込みます。
Add-Type -AssemblyName "System.IO.Compression.FileSystem"
フォルダを丸ごとアーカイブするスクリプト例:
$SourceFolder = 'C:\Logs' $ZipFileName = 'C:\PS\logs.zip' [IO.Compression.ZipFile]::CreateFromDirectory($SourceFolder, $ZipFileName)
ZIPアーカイブを更新し、圧縮率を設定したい場合は、次のPowerShellコードを使用します。
$addfile = 'C:\temp\new.log' $compressionLevel = [System.IO.Compression.CompressionLevel]::Fastest $zip = [System.IO.Compression.ZipFile]::Open($zipFileName, 'update') [System.IO.Compression.ZipFileExtensions]::CreateEntryFromFile($zip, $addfile, (Split-Path $addfile -Leaf), $compressionLevel) $zip.Dispose()
最後の $zip.Dispose() は、ZIPファイルを確実に閉じて変更を保存するために必要なコマンドです。
ZIPアーカイブの内容一覧を表示することもできます。
[System.IO.Compression.ZipFile]::OpenRead($zipFileName).Entries.Name
また、Out-GridViewを活用すれば、圧縮前後のファイルサイズや最終書き込み日時などの詳細情報を表形式で一覧表示できます。
$ZipFileName = "C:\PS\logs1.zip"
$Stream = New-Object IO.FileStream($ZipFileName , [IO.FileMode]::Open)
$ZipArchive = New-Object IO.Compression.ZipArchive($Stream)
$ZipArchive.Entries |
Select-Object Name,
@{Name="File Path";Expression={$_.FullName}},
@{Name="Compressed Size (KB)";Expression={"{0:N2}" -f($_.CompressedLength/1kb)}},
@{Name="UnCompressed Size (KB)";Expression={"{0:N2}" -f($_.Length/1kb)}},
@{Name="File Date";Expression={$_.LastWriteTime}} | Out-GridView
$ZipArchive.Dispose()
$Stream.Close()
$Stream.Dispose()
ZIPファイルをC:\Logsフォルダへ解凍するには、次のコマンドを使用します。
$SourceZipFile = 'C:\PS\logs.zip' $TargetFolder = 'C:\Logs' [IO.Compression.ZipFile]::ExtractToDirectory($SourceZipFile, $TargetFolder)
-
MacでZIPファイルを解凍・展開する方法を徹底解説!初心者でもできる3つの手順
ZIP形式は、最も広く使われているアーカイブファイル形式のひとつです。高度な圧縮技術によって複数のファイルをひとつのフォルダにまとめられるため、メールでの送付やデータ共有の際に、添付ファイルを何度も分けて送る必要がありません。大容量のファイルでも一度に、しかも比較的速い速度で送受信できます。 では、メールでZIPファイルを受け取ったときや、Webサイトからソフトウェアをダウンロードした際には、どうすればよいのでしょうか。「次に何をすればいいのかわからない」とお悩みの方もご安心ください。Macでの解凍(展開)作業はとてもシンプルです。この記事では、WinZipなどのサードパーティ製ソフトを使わ
-
Windows 10のPowerShellでファイルを圧縮・解凍する方法【コマンド実例付き】
ZIP機能を使うと、ファイルとその関連設定を1つのファイルにまとめて、容量を小さく圧縮できます。こうして作成したZIPファイルは、メールやその他のファイル共有サービスを通じて、簡単に他の人へ送信できるのが大きなメリットです。 ZIP圧縮といえば、WinRARや7-Zipといった専用ソフトを使うのが一般的ですが、実はWindowsに標準搭載されているPowerShellでも、追加ソフトなしでファイルの圧縮・解凍が可能です。この記事では、その具体的な手順をわかりやすく解説します。 関連記事:WindowsとMacでファイルを圧縮する方法 PowerShellでファイルをZIP圧縮する方法 まずは、