【问题标题】:Version of jar file by reading its manifest using powershelljar 文件的版本,通过使用 powershell 读取其清单
【发布时间】:2025-12-29 18:15:06
【问题描述】:

我正在运行一个 powershell 脚本来识别版本。对于 DLL 和 EXE,使用以下函数获取版本。我还有其他一些扩展名为 .Jar 的文件。有没有办法可以使用 powershell 打开 jar 并从它们的清单中获取它的版本。

请告诉我。

@{n='版本';e={$_.versioninfo.Fileversion}}

【问题讨论】:

  • 嗨。我下面的回答有帮助吗?
  • 我会试一试告诉你

标签: powershell


【解决方案1】:

看起来你必须先从 jar 文件中提取。我下载了java并使用我也下载的jar文件测试了自己

& "C:\Program Files\Java\jdk1.8.0_191\bin\jar.exe" xvf junit-4.10.jar META-INF/MANIFEST.MF
get-content .\META-INF\MANIFEST.MF

结果

Manifest-Version: 1.0
Ant-Version: Apache Ant 1.8.2
Created-By: 1.6.0_26-b03-384-10M3425 (Apple Inc.)

话虽如此,请在此处阅读Do we want single, complete answers?,其中提到了实施版本,因此请确保您知道版本的位置以及是否可以依赖它。

【讨论】:

  • 谢谢。我会试一试告诉你
  • 我的回答对你有帮助吗?
【解决方案2】:

这在 Server 2016/PS 5.1 和 Win 10/PS 7.1 上用作 PowerShell 脚本,无需安装任何额外内容。它读取 zip 存档中的 MANIFEST.MF 文件并写入标准输出。这是在这里找到的选项 4:https://*.com/a/37561878/101151

确保将绝对路径传递给 [io.compression.zipfile]::OpenRead。它似乎绑定到它运行的第一个目录,并将其重新用于相对路径。

# Read the MANIFEST.MF from a Java .JAR (really a .zip) file and output to standard output

param(
    [Parameter(Mandatory=$true)][string]$jarname
)

# The following code is based on an answer at https://*.com/a/37561878/101151
Add-Type -assembly "system.io.compression.filesystem"
$zip = [io.compression.zipfile]::OpenRead((Get-ChildItem $jarname).FullName)
$file = $zip.Entries | where-object { $_.Name -eq "MANIFEST.MF"}
$stream = $file.Open()

$reader = New-Object IO.StreamReader($stream)
$text = $reader.ReadToEnd()
$text

$reader.Close()
$stream.Close()
$zip.Dispose()

【讨论】: