如何从PowerShell中的.dll
或.exe
文件中获取版本信息?
我对File Version
特别感兴趣,但其他版本信息(即Company
,Language
,Product Name
等)也会有所帮助。< / p>
答案 0 :(得分:153)
现在您可以从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
或者更确切地说,像这样:
Update-TypeData -TypeName System.IO.FileInfo -MemberName FileVersion -MemberType ScriptProperty -Value {
[System.Diagnostics.FileVersionInfo]::GetVersionInfo($this.FullName) | % {
[Version](($_.FileMajorPart, $_.FileMinorPart, $_.FileBuildPart, $_.FilePrivatePart)-join".")
}
}
现在每次执行Get-ChildItem
或Get-Item
时,您都会拥有一个显示更新的FileVersion的FileVersion
属性...
答案 1 :(得分:119)
由于PowerShell可以调用.NET类,因此您可以执行以下操作:
[System.Diagnostics.FileVersionInfo]::GetVersionInfo("somefilepath").FileVersion
或者作为noted here在文件列表中:
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!125.entry
答案 2 :(得分:47)
'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
答案 3 :(得分:16)
我更喜欢安装PowerShell Community Extensions,只使用它提供的Get-FileVersionInfo函数。
像这样:
Get-FileVersionInfo MyAssembly.dll
输出如:
ProductVersion FileVersion FileName -------------- ----------- -------- 1.0.2907.18095 1.0.2907.18095 C:\Path\To\MyAssembly.dll
我已经将它用于整个程序集目录并取得了巨大成功。
答案 4 :(得分:11)
另一种方法是使用内置文件访问技术:
(get-item .\filename.exe).VersionInfo | FL
您还可以从VersionInfo获取任何特定属性,因此:
(get-item .\filename.exe).VersionInfo.FileVersion
这与dir技术非常接近。
答案 5 :(得分:8)
我知道已经解决了这个问题,但是如果有人想输入更少的字符,我相信这是在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
...但是我认为我的方法更酷,而且对于某些人而言,更容易记住。 (但通常更酷)。
答案 6 :(得分:7)
这是基于的其他答案,但正是我所追求的:
(Get-Command C:\Path\YourFile.Dll).FileVersionInfo.FileVersion
答案 7 :(得分:4)
[System.Diagnostics.FileVersionInfo]::GetVersionInfo("Path\To\File.dll")
答案 8 :(得分:3)
我觉得这很有用:
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
}
答案 9 :(得分:2)
正如EBGreen所说,[System.Diagnostics.FileVersionInfo] :: GetVersionInfo(路径)将起作用,但请记住,您也可以获取FileVersionInfo的所有成员,例如:
[System.Diagnostics.FileVersionInfo]::GetVersionInfo(path).CompanyName
您应该能够使用此处记录的FileVersionInfo的每个成员,这将基本上为您提供有关该文件的任何内容。
答案 10 :(得分:2)
这是另一种方法。它使用Get-WmiObject CIM_DATAFILE来选择版本。
(Get-WmiObject -Class CIM_DataFile -Filter "Name='C:\\Windows\\explorer.exe'" | Select-Object Version).Version