如何在PowerShell中从.dll
或.exe
文件中获取版本信息?
我特别关注文件版本(File Version)
,但其他版本信息(如公司(Company)
、语言(Language)
、产品名称(Product Name)
等)也将很有帮助。
如何在PowerShell中从.dll
或.exe
文件中获取版本信息?
我特别关注文件版本(File Version)
,但其他版本信息(如公司(Company)
、语言(Language)
、产品名称(Product Name)
等)也将很有帮助。
Get-Item
或Get-ChildItem
的输出中的FileVersionRaw
(或ProductVersionRaw),方法如下:(Get-Item C:\Windows\System32\Lsasrv.dll).VersionInfo.FileVersionRaw
实际上,这是我在下面的原始答案中使用 Update-TypeData
创建的相同的 ScriptProperty
,但现在已内置。
在 PowerShell 4 中,您可以从 Get-Item 或 Get-ChildItem 获取 FileVersionInfo,但它会显示来自出货产品的原始文件版本,而不是更新后的版本。例如:
(Get-Item C:\Windows\System32\Lsasrv.dll).VersionInfo.FileVersion
有趣的是,你可以使用以下代码获取更新(修补)后的 ProductVersion:
(Get-Command C:\Windows\System32\Lsasrv.dll).Version
Get-Item C:\Windows\System32\Lsasrv.dll | ft FileName, File*Part
或者通过从这里提取数据:
[System.Diagnostics.FileVersionInfo]::GetVersionInfo($this.FullName)
您可以通过在PowerShell中更新TypeData,轻松地将此添加到所有FileInfo对象中:
Update-TypeData -TypeName System.IO.FileInfo -MemberName FileVersionRaw -MemberType ScriptProperty -Value {
[System.Diagnostics.FileVersionInfo]::GetVersionInfo($this.FullName) | % {
[Version](($_.FileMajorPart, $_.FileMinorPart, $_.FileBuildPart, $_.FilePrivatePart)-join".")
}
}
Get-ChildItem
或Get-Item
时,您将拥有一个FileVersionRaw
属性,显示更新的文件版本...由于PowerShell可以调用.NET类,因此您可以执行以下操作:
[System.Diagnostics.FileVersionInfo]::GetVersionInfo("somefilepath").FileVersion
或者在文件列表中注意到:
get-childitem * -include *.dll,*.exe | foreach-object { "{0}`t{1}" -f $_.Name, [System.Diagnostics.FileVersionInfo]::GetVersionInfo($_).FileVersion }
甚至可以将其作为脚本更加方便:https://jtruher3.wordpress.com/2006/05/14/powershell-and-file-version-information/
get-item C:\Windows\System32\ubpm.dll | % VersionInfo | fl * -force
并将 FilePrivatePart 与 FileVersion 的最后一部分进行比较。FileVersion 显示的是最初发行的版本,而不是修补程序版本。另一方面,这个命令显示了修补后的版本号:(get-command C:\Windows\System32\ubpm.dll).Version。 - Jaykul(Get-Command ... ).Version
返回_ProductVersion_而不是_FileVersion_,有时这很重要。因此,为了获得实际返回更新的FileVersion的完整解决方案,请查看下面我的答案中的Update-TypeData示例。 - Jaykul'dir' 是 Get-ChildItem 的别名,当你从文件系统中调用它时,它将返回 System.IO.FileInfo 类,它具有 VersionInfo 属性。因此...
要获取单个文件的版本信息,请执行以下操作:
PS C:\Windows> (dir .\write.exe).VersionInfo | fl
OriginalFilename : write
FileDescription : Windows Write
ProductName : Microsoft® Windows® Operating System
Comments :
CompanyName : Microsoft Corporation
FileName : C:\Windows\write.exe
FileVersion : 6.1.7600.16385 (win7_rtm.090713-1255)
ProductVersion : 6.1.7600.16385
IsDebug : False
IsPatched : False
IsPreRelease : False
IsPrivateBuild : False
IsSpecialBuild : False
Language : English (United States)
LegalCopyright : © Microsoft Corporation. All rights reserved.
LegalTrademarks :
PrivateBuild :
SpecialBuild :
对于多个文件,可以使用以下代码:
PS C:\Windows> dir *.exe | %{ $_.VersionInfo }
ProductVersion FileVersion FileName
-------------- ----------- --------
6.1.7600.16385 6.1.7600.1638... C:\Windows\bfsvc.exe
6.1.7600.16385 6.1.7600.1638... C:\Windows\explorer.exe
6.1.7600.16385 6.1.7600.1638... C:\Windows\fveupdate.exe
6.1.7600.16385 6.1.7600.1638... C:\Windows\HelpPane.exe
6.1.7600.16385 6.1.7600.1638... C:\Windows\hh.exe
6.1.7600.16385 6.1.7600.1638... C:\Windows\notepad.exe
6.1.7600.16385 6.1.7600.1638... C:\Windows\regedit.exe
6.1.7600.16385 6.1.7600.1638... C:\Windows\splwow64.exe
1,7,0,0 1,7,0,0 C:\Windows\twunk_16.exe
1,7,1,0 1,7,1,0 C:\Windows\twunk_32.exe
6.1.7600.16385 6.1.7600.1638... C:\Windows\winhlp32.exe
6.1.7600.16385 6.1.7600.1638... C:\Windows\write.exe
ls application.exe | % versioninfo
ls
是 Get-ChildItem
的别名。%
是 ForEach-Object
的别名。versioninfo
是写 {$_.VersionInfo}
的速记方式。使用这种方式使用 ls
的好处是可以轻松地适应在子文件夹中查找给定文件。例如,以下命令将返回所有名为 application.exe
的文件在子文件夹中的版本信息:
ls application.exe -r | % versioninfo
-r
是 -Recurse
的别名您可以通过添加 -ea silentlycontinue
进一步细化此操作,以忽略无法搜索的文件夹中的权限错误等问题:
ls application.exe -r -ea silentlycontinue | % versioninfo
-ea
是 -ErrorAction
的别名如果你的结果中出现省略号 (...),可以附加 | fl
以使用不同的格式返回信息。这将返回更多详细信息,尽管以列表格式而不是每个结果一行的格式呈现:
-ea
是 -ErrorAction
的别名如果你的结果中出现省略号 (...),可以附加| fl
以使用不同的格式返回信息。这将返回更多详细信息,尽管以列表格式而不是每个结果一行的格式呈现:
ls application.exe -r -ea silentlycontinue | % versioninfo | fl
fl
是 Format-List
的别名。我意识到这与xcud的回答非常相似,因为ls
和dir
都是Get-ChildItem
的别名。但我希望我的“最短”方法能够帮助某些人。
最后的示例可以按以下方式用长格式编写:
Get-ChildItem -Filter application.exe -Recurse -ErrorAction SilentlyContinue | ForEach-Object {$_.VersionInfo} | Format-List
...但我认为我的方式更酷,对于一些人来说更容易记住。(主要是更酷)。
我喜欢安装PowerShell社区扩展,并使用它提供的Get-FileVersionInfo函数。
像这样:
Get-FileVersionInfo MyAssembly.dll
输出结果如下:
ProductVersion FileVersion FileName -------------- ----------- -------- 1.0.2907.18095 1.0.2907.18095 C:\Path\To\MyAssembly.dll
我已经成功地将其用于整个程序集目录。
另一种方法是使用内置的文件访问技术:
(get-item .\filename.exe).VersionInfo | FL
你也可以从VersionInfo中获取任何特定的属性,例如:
(get-item .\filename.exe).VersionInfo.FileVersion
这非常接近dir技巧。
这是基于其他回答的,但正是我想要的:
(Get-Command C:\Path\YourFile.Dll).FileVersionInfo.FileVersion
Get-Command
很感兴趣。您能详细说明一下它的作用吗(甚至在调用属性FileVersionInfo之前)? - Stephane Rolland[System.Diagnostics.FileVersionInfo]::GetVersionInfo("Path\To\File.dll")
function Get-Version($filePath)
{
$name = @{Name="Name";Expression= {split-path -leaf $_.FileName}}
$path = @{Name="Path";Expression= {split-path $_.FileName}}
dir -recurse -path $filePath | % { if ($_.Name -match "(.*dll|.*exe)$") {$_.VersionInfo}} | select FileVersion, $name, $path
}
[System.Diagnostics.FileVersionInfo]::GetVersionInfo(path).CompanyName
你应该能够使用此处记录的FileVersionInfo的每个成员,这将为您提供有关文件的基本信息。
(Get-Command C:\Path\YourFile.Dll).FileVersionInfo.FileVersion
。请注意,翻译保持原意,内容更加通俗易懂。 - rand0m1Get-Command
很感兴趣。您能详细说明它的作用吗? - Stephane Rolland(Get-Item C:\Windows\System32\Lsasrv.dll).VersionInfo.ProductVersion
是获取与答案中记录的相同ProductVersion信息的较新且更简单的方法吗?我真的不相信Microsoft会一致使用“ProductVersion”这个术语。 - Tydaeus