如何从PowerShell中的文件.dll
或.exe
文件中获取版本信息?
我在特别感兴趣File Version
,但其他版本信息(也就是Company
,Language
,Product Name
,等)将是有益的为好.
现在,您可以从Get-Item或Get-ChildItem获取FileVersionInfo,但它将显示已发布产品的原始FileVersion,而不是更新版本.例如:
(Get-Item C:\Windows\System32\Lsasrv.dll).VersionInfo.FileVersion
有趣的是,您可以使用以下命令获取更新(修补)的ProductVersion:
(Get-Command C:\Windows\System32\Lsasrv.dll).Version
请注意,对于像lsasrv这样的文件(由于2014年11月SSL/TLS/RDS中的安全问题而被替换),这两个命令报告的版本不同,第二个版本是正确的版本.
但是,虽然它在LSASrv中是正确的,但ProductVersion和FileVersion可能是不同的(事实上它很常见).因此,获取更新的 Fileversion 的唯一方法是自己构建它,如下所示:
Get-Item C:\Windows\System32\Lsasrv.dll | ft FileName, File*Part
或者更确切地说,像这样:
[System.Diagnostics.FileVersionInfo]::GetVersionInfo($this.FullName)
现在,每次你做,Get-ChildItem
或者Get-Item
你将拥有一个FileVersion
显示更新的FileVersion 的属性...
由于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 }
甚至更好的脚本:http://jtruher.spaces.live.com/blog/cns!7143DA6E51A2628D!123.entry
'dir'是Get-ChildItem的别名,当您从具有VersionInfo属性的文件系统调用它时,它将返回System.IO.FileInfo类.所以......
要获取单个文件的版本信息,请执行以下操作:
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
我更喜欢安装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技术非常接近.
我意识到这已经得到了解答,但是如果有人对输入更少的字符感兴趣,我相信这是在PS v3 +中写这个的最短方式:
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
以不同格式返回信息.这会返回更多细节,尽管在列表中进行格式化,而不是每个结果在一行上:
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
...但我认为我的方式更酷,对某些人来说,更容易记住.(但大多数冷却).
这是基于其他答案,但正是我所追求的:
(Get-Command C:\Path\YourFile.Dll).FileVersionInfo.FileVersion