如何从PowerShell 中的.dll
or文件中获取版本信息?.exe
我对 很感兴趣File Version
,尽管其他版本信息(即Company
、Language
、Product Name
等)也会有所帮助。
如何从PowerShell 中的.dll
or文件中获取版本信息?.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
我在“原始”和“修补”之间所做的区别基本上是由于 FileVersion 的计算方式(请参阅此处的文档)。基本上从 Vista 开始,Windows API GetFileVersionInfo 正在从语言中性文件 (exe/dll) 中查询部分版本信息,并从特定语言的 mui 文件中查询非固定部分(每次文件更改时都不会更新) )。
因此,对于像 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)
您可以通过更新 PowerShell 中的 TypeData 轻松地将其添加到所有 FileInfo 对象:
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 的属性......
由于 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/
'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
我意识到这已经得到了回答,但如果有人有兴趣输入更少的字符,我相信这是在 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
...但我认为我的方式更酷,对某些人来说更容易记住。(但大多更酷)。
我更喜欢安装PowerShell Community Extensions并只使用它提供的 Get-FileVersionInfo 函数。
像这样:
获取 FileVersionInfo MyAssembly.dll
输出如下:
产品版本文件版本文件名 -------------- ----------- -------- 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
[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
}
正如 EBGreen 所说,[System.Diagnostics.FileVersionInfo]::GetVersionInfo(path) 将起作用,但请记住,您还可以获取 FileVersionInfo 的所有成员,例如:
[System.Diagnostics.FileVersionInfo]::GetVersionInfo(path).CompanyName
您应该能够使用此处记录的 FileVersionInfo 的每个成员,这基本上可以为您提供有关该文件的任何信息。
这里有另一种方法。它使用 Get-WmiObject CIM_DATAFILE 来选择版本。
(Get-WmiObject -Class CIM_DataFile -Filter "Name='C:\\Windows\\explorer.exe'" | Select-Object Version).Version