如何使用 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 中不可用)。
我有一个 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
andForEach-Object
cmdlets 实现相同的效果,尽管对于已经在内存中或很容易装入内存的集合, 方法更快。- 但是,
'First'
参数会在找到第一个匹配项后停止处理 - 一项重要的性能优化 - 当前 不可用Where-Object
; GitHub issue #v 建议将.Where()
方法目前独有的那些功能也带到 cmdlet 中。
- 但是,
在 PowerShell (Core) 7+ 中,调用
[IO.Path]
methods is to use theSplit-Path
cmdlet 的替代方法,现在提供-Extension
和-LeafBase
开关(在 Windows PowerShell 中不可用)。