如何使用 Powershell 获取 zip 存档中特定文件的文件名?

How to fetch the filename of a specific file inside a zip archive using Powershell?

我有一个 zip 存档需要检查。我需要使用 Powershell 查找文件扩展名为 .serverrevision 的特定文件的文件名。

zip 存档中只有一个具有此文件扩展名的文件。文件名类似于“2.1.4.serverrevision”。我需要提取版本号,即本例中的 2.1.4。

我知道我可以使用以下方法列出 zip 存档的内容:

[IO.Compression.ZipFile]::OpenRead($ziparchive.FullName).Entries.FullName | %{ "$ziparchive`:$_" }

但我不知道如何在函数 returns 的列表中搜索该文件扩展名,然后找出文件名。文件名可能类似于 2.1.4.serverrevision.

有什么建议吗?

使用 .Where().ForEach() array methods 的组合:.Where() 过滤器 .ForEach()transform(提取感兴趣的名字部分):

[IO.Compression.ZipFile]::OpenRead($ziparchive.FullName).Entries.FullName.
  Where({ [IO.Path]::GetExtension($_) -eq '.serverrevision' }, 'First').
  ForEach({ [IO.Path]::GetFileNameWithoutExtension($_) } 

注:

  • 您可以使用类似的 Where-Object and ForEach-Object cmdlets 实现相同的效果,尽管对于已经在内存中或很容易装入内存的集合, 方法更快。

    • 但是,'First' 参数会在找到第一个匹配项后停止处理 - 一项重要的性能优化 - 当前 不可用 Where-Object ; GitHub issue #v 建议将 .Where() 方法目前独有的那些功能也带到 cmdlet 中。
  • PowerShell (Core) 7+ 中,调用 [IO.Path] methods is to use the Split-Path cmdlet 的替代方法,现在提供 -Extension-LeafBase 开关(在 Windows PowerShell 中不可用)。