不解压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,根据环境的不同,可能会导致文件被占用的错误。

因此,即使中途发生错误,也采用了在 finally 中执行 Dispose() 的形式。即使是简短的脚本,打开外部资源后将其关闭也应该作为一套完整的流程。

GitHub示例

官方信息・一手资料

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