ZIPを解凍せず中身を確認する ― PowerShellから.NETのZipFileを直接使う

PowerShellカテゴリを表すパンダのイラスト PowerShell

この記事について
この記事は、生成AIを活用した自動生成フローで作成しています。.NETのZipFile.OpenReadとZipArchiveEntryの公式APIを確認し、ZIPを展開せず内容を確認するPowerShell TIPSとして整理しています。

検証ステータス:📘 .NET公式API確認済み・サンプル実装済み・PowerShell実機確認は未実施

ZIPを解凍せず中身を確認する ― PowerShellから.NETのZipFileを直接使う

ZIPの内容を確認したいだけなら、毎回展開する必要はありません。PowerShellから .NETSystem.IO.Compression.ZipFile.OpenRead() を使うと、ZIPを読み取り用に開き、各entryの名前やサイズを一覧できます。

最小例

$path = (Resolve-Path -LiteralPath ".\sample.zip").Path

# ZIPを読み取り専用として開きます。ここでは展開しません。

$archive = [System.IO.Compression.ZipFile]::OpenRead($path)

try {
    $archive.Entries | Select-Object FullName, Length, CompressedLength
}
finally {

    # ファイルを掴んだままにしないよう、必ず閉じます。

    $archive.Dispose()
}

Entries はZIP内部のentry一覧です。各entryから、元のサイズを表す Length、圧縮後サイズを表す CompressedLength などを取得できます。

「解凍しない」とは何をしているのか

flowchart LR
    A[ZIPファイル] --> B[ZipFile.OpenRead]
    B --> C[ZipArchive]
    C --> D[Entries]
    D --> E[ファイル名]
    D --> F[元サイズ Length]
    D --> G[圧縮サイズ CompressedLength]

この処理はentryの一覧やメタデータを読むもので、各ファイルを保存先へ展開する処理ではありません。そのため、「どんなファイルが入っているか」「想定外に巨大なentryがないか」を展開前に見る用途に向きます。

ただし、ZIPを読むだけで未知のファイルが安全になるわけではありません。 信頼できないアーカイブを後で展開・実行する場合は、パスやファイル内容など別の安全確認が必要です。

完全版では集計も出す

GitHub版ではentryごとに次を表示します。

  • Name: ZIP内部のパス

  • Size: 元サイズ

  • CompressedSize: 圧縮後サイズ

  • LastWriteTime: entryに記録された更新日時

  • IsDirectory: ディレクトリentryか

さらにファイル数、元サイズ合計、圧縮サイズ合計も出します。

この方法なら、たとえば「ZIPを受け取ったが、中身を展開する前に容量とファイル構成だけ見たい」という確認作業を短くできます。

Disposeを省かない

OpenRead() で開いた ZipArchive はファイルを保持します。後始末をしないまま別処理でZIPを移動・上書きしようとすると、環境によってはファイル使用中の原因になります。

そのため、エラーが途中で起きても finallyDispose() する形にしています。短いスクリプトでも、外部リソースを開いたら閉じるところまでを1セットにします。

GitHubサンプル

公式情報・一次情報

ライセンス:本記事のテキスト/コードは特記なき限り CC BY 4.0 です。引用の際は出典URL(本ページ)を明記してください。
利用ポリシー もご参照ください。
タイトルとURLをコピーしました