こんにちは。チェシャ男です。(-皿-)
今回は、Compress-Archive について概要から使用例について簡単にご紹介します。
「コマンドレットリファレンス」カテゴリの記事では省略している情報を参照したい場合に本記事をご覧ください。
もくじ
はじめに
本記事は英語のリファレンス情報しかないコマンドレットについて「Get-Help」等の情報を参考に検証した結果を掲載しています。公式見解ではないことにご注意ください。
正式なヘルプを参照したい場合は、「Get-help Compress-Archive -online」を実行し公式ヘルプをご覧ください。
また、本記事内の例は動作を確認していますが、動作を確約しているわけではありません。
Compress-Archive の概要
Compress-Archive では、指定したファイルやフォルダから ZIPファイル(アーカイブ)を作成します
[blogcard url=”https://cheshire-wara.com/powershell/ps-cmdlets/item-file/compress-archive/”]基本の構文
#パターン① Compress-Archive [-Path] <String[]> [-DestinationPath] <String> [-CompressionLevel <String>] [-WhatIf] [-Confirm] [<CommonParameters>] #パターン② Compress-Archive [-Path] <String[]> [-DestinationPath] <String> [-CompressionLevel <String>] [-Update] [-WhatIf] [-Confirm] [<CommonParameters>] #パターン③ Compress-Archive [-Path] <String[]> [-DestinationPath] <String> [-CompressionLevel <String>] [-Force] [-WhatIf] [-Confirm] [<CommonParameters>] #パターン④ Compress-Archive -LiteralPath <String[]> [-DestinationPath] <String> [-CompressionLevel <String>] [-Update] [-WhatIf] [-Confirm] [<CommonParameters>] #パターン⑤ Compress-Archive -LiteralPath <String[]> [-DestinationPath] <String> [-CompressionLevel <String>] [-Force] [-WhatIf] [-Confirm] [<CommonParameters>] #パターン⑥ Compress-Archive -LiteralPath <String[]> [-DestinationPath] <String> [-CompressionLevel <String>] [-WhatIf] [-Confirm] [<CommonParameters>]
[] で囲まれたパラメーターは任意のオプションです。
{}で囲まれた箇所は要素を選択してください。
<>で囲まれた箇所はオブジェクトの型名を示しています。
動作の説明
Compress-Archive コマンドレットは、1つ以上の指定されたファイルまたはフォルダから圧縮ファイル(アーカイブ)を作成します。
アーカイブファイルとは、複数のファイルを1つのZIPファイルにパッケージ化したものです。必要に応じて圧縮することで配布しやすくなります。
“-CompressionLevel”パラメーターで指定された圧縮アルゴリズムを使用して圧縮方法を変更できます。
Compress-Archiveは「.NET Framework」にある[System.IO.Compression.ZipArchive]ライブラリを使用してファイルを圧縮するため、 圧縮できる最大ファイルサイズは現在2GBです。
各パラメータについて
-CompressionLevel <String>
アーカイブファイルを作成するときの適用する圧縮量(サイズ)を指定します。
圧縮を高速化すると、ファイルを作成する時間が短縮されますが、ファイルサイズが大きくなる可能性があります。
このパラメーターを指定しない場合、コマンドはデフォルト値Optimalを使用します。
このパラメータの許容値は次のとおりです。
Fastest:使用可能な最速の圧縮方法を使用して、処理時間を短縮します。
→ファイルサイズは大きくなる
NoCompression:アーカイブするファイルを圧縮しません。
→ファイルサイズは最も大きい
Optimal:処理時間はファイルサイズによって異なります。
→ファイルサイズは可能な限り小さくなる
-Confirm [<SwitchParameter>]
コマンドレットを実行する前に確認を求めるプロンプトが表示されます。
-DestinationPath <String>
ZIPファイル(アーカイブ)の出力パスを指定します。 このパラメータは必須です。 指定された” -DestinationPath “値には、ZIPファイル名まで含める必要があります。
ZIPファイルへの絶対パスまたは相対パスのいずれかで指定できます。
” -DestinationPath “で指定されたファイル名に「.zip」ファイル名拡張子がない場合は「.zip」拡張子を追加します。
-Force [<SwitchParameter>]
ユーザーの確認を求めずにコマンドを強制実行します。
-LiteralPath
ZIPファイル(アーカイブ)に追加するファイルへのパスを指定します。
Pathパラメーターとは異なり LiteralPath に指定された値通りに使用されます。 文字はワイルドカードとして解釈されません。
パスにエスケープ文字が含まれている場合は、各エスケープ文字を一重引用符で囲んで、エスケープシーケンスとして解釈されないように指示します。
複数のパスを指定するには、“,(カンマ)”を使用してパスを区切ります。
-Path <String[]>
ZIPファイル(アーカイブ)に追加される元のファイルパスを指定します。
Pathパラメータにはワイルドカード文字を使用できます。 ワイルドカード文字を使用すると、フォルダ内のすべてのファイルをZIP形式のアーカイブファイルに追加できます。
複数のパスを指定するには、”,(カンマ)”を使用してパスを区切ります。
-Update [<SwitchParameter>]
アーカイブ内の古いバージョンのファイルを同じ名前の新しいバージョンのファイルに置き換えることによって、指定されたアーカイブファイル内を更新します。
このパラメータを追加して、既存のアーカイブにファイルを追加することもできます。
-WhatIf [<SwitchParameter>]
コマンドレットは実際には実行されず、コマンドレットが実行された場合の動作を示します。
<CommonParameters>
このコマンドレットでは、
Verbose、Debug、ErrorAction、ErrorVariable、WarningAction、WarningVariable、OutBuffer、PipelineVariable、OutVariable
の各共通パラメーターを使用することができます。
入力値
System.String
(パスを含む文字列を1つまたは複数のファイルにパイプすることができます。
出力値
System.IO.FileInfo
使用例
例1:アーカイブファイルを作成する
PS C:\> Compress-Archive -LiteralPath C:\work\hoge.txt, C:\work\fuga.txt -CompressionLevel Optimal -DestinationPath C:\Archives\Archives.Zip
この例では、LiteralPathパラメータで指定されたhoge.txtとfuge.txtの2つのファイルを圧縮して、新しいアーカイブファイルArchive.zipを作成します。
この操作で指定された圧縮レベルはOptimal(最適)です。
例2:ワイルドカード文字を含むアーカイブを作成する
PS C:\> Compress-Archive -Path C:\work\* -CompressionLevel Fastest -DestinationPath C:\Archives\Draft
この例では、新しいアーカイブファイルDraft.zipを「C:\ Archives」フォルダに作成します。
ファイル名拡張子「.zip」はDestinationPathパラメータの値に追加されていませんが、アーカイブファイル名に自動的に「.zip」を追加します。
新しいアーカイブファイルには、 Pathパラメータの特定のファイル名の代わりにワイルドカード文字が使用されているため、「C:\ work」フォルダ内のすべてのファイルが含まれています。
指定された圧縮レベルはFastest(高速)で、出力ファイルが大きくなる可能性がありますが、多数のファイルを高速に圧縮します。
例3:既存のアーカイブファイルを更新する
PS C:\> Compress-Archive -Path C:\work\* -Update -DestinationPath C:\Archives\Draft.Zip
この例では、「C:\ Archives」フォルダ内の既存のアーカイブファイル(Draft.Zip)を更新します。
この例では、Draft.Zipが「C:\ work」フォルダから内の既存(同名)のファイルが新しいバージョンであれば更新し、追加された新しいファイルであれば新規に追加されます。
例4:フォルダ全体からアーカイブを作成する
PS C:\> Compress-Archive -Path C:\work -DestinationPath C:\Archives\Draft
この例では、フォルダ全体(C:\ work)からアーカイブを作成します。
ファイル名拡張子「.zip」はDestinationPathパラメータの値に記載されていませんでしたが、アーカイブファイル名に自動的に「.zip」追加します。
以下の記載についてですが、[System.IO.Compression.ZipArchive]を直接呼び出すと2GB以上も圧縮できるように思えるのですが、以下の記載は正しいのでしょうか。宜しければどのような仕組みになっているかをご教示いただきたいです。
—————————————————————————————
Compress-Archiveは「.NET Framework」にある[System.IO.Compression.ZipArchive]ライブラリを使用してファイルを圧縮するため、 圧縮できる最大ファイルサイズは現在2GBです。
—————————————————————————————
ななしさん
コメントありがとうございます!
上記の2Gb制限は公式のドキュメントから引用しています。
下にComress-ArchiveのソースへのGithubリンクを載せていますが、現状のコマンドレットの定義の中には2GBに関する制限はないです。(ざっとしかソース見てないので見落としがあったらごめんなさい)
『Compress-Archiveの挙動は「System.IO.Compression.ZipArchive」に依存して2GBの制限がある』と公式に書いている以上、それに従うしかないですが実際のところ制限されてないかと思います。コマンドレットからも2GB超えたファイルをZIPできましたし…
これ以上は.NETのソース見ないといけないのですぐにはわかりません(・ω・`)
>>Compress-Archive | Microsoft Docs(公式のサイト)
https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.archive/Compress-Archive?view=powershell-6
>>PowerShell/Microsoft.PowerShell.Archive(コマンドレットのソース)
https://github.com/PowerShell/Microsoft.PowerShell.Archive/blob/master/Microsoft.PowerShell.Archive/Microsoft.PowerShell.Archive.psm1
>>ZipArchive Class (System.IO.Compression) | Microsoft Docs
https://docs.microsoft.com/ja-jp/dotnet/api/system.io.compression.ziparchive?view=netframework-4.7.2