在 PowerShell 中获取文件版本

如何从 PowerShell 中的 .dll.exe文件获取版本信息?

我特别感兴趣的是 File Version,虽然其他版本的信息(即,CompanyLanguageProduct Name等)将是有帮助的。

272423 次浏览
[System.Diagnostics.FileVersionInfo]::GetVersionInfo("Path\To\File.dll")

由于 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/

正如 EBGreen 所说。诊断。[ FileVersionInfo ] : : GetVersionInfo (path)可以工作,但是请记住,您还可以获取 FileVersionInfo 的所有成员,例如:

[System.Diagnostics.FileVersionInfo]::GetVersionInfo(path).CompanyName

您应该能够使用这里记录的 FileVersionInfo 的每个成员,它基本上可以为您提供任何您想要的关于该文件的内容。

我更喜欢安装 PowerShell 社区扩展,只使用它提供的 Get-FileVersionInfo 功能。

像这样:

Get-FileVersionInfo MyAssembly.dll

with output like:

ProductVersion   FileVersion      FileName
--------------   -----------      --------
1.0.2907.18095   1.0.2907.18095   C:\Path\To\MyAssembly.dll

我已经成功地将它用于整个程序集目录。

由于 Windows10中的 PowerShell 5,您可以在 Get-ItemGet-ChildItem的输出中查看 FileVersionRaw(或 ProductVersionRaw) ,如下所示:

(Get-Item C:\Windows\System32\Lsasrv.dll).VersionInfo.FileVersionRaw

它实际上是相同的 ScriptProperty从我的 Update-TypeData在原来的答案下面,但内置现在。

在 PowerShell 4中,您可以从 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 FileVersionRaw -MemberType ScriptProperty -Value {
[System.Diagnostics.FileVersionInfo]::GetVersionInfo($this.FullName) | % {
[Version](($_.FileMajorPart, $_.FileMinorPart, $_.FileBuildPart, $_.FilePrivatePart)-join".")
}
}

现在,每次执行 Get-ChildItemGet-Item时,都会有一个 FileVersionRaw属性显示更新后的文件版本..。

“ 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

另一种方法是使用内置的文件访问技术:

(get-item .\filename.exe).VersionInfo | FL

您还可以从 VersionInfo 获得任何特定的属性,因此:

(get-item .\filename.exe).VersionInfo.FileVersion

这与 dir 技术非常接近。

我发现这个很有用:

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
}

这是其他答案的 基于,但这正是我想要的:

(Get-Command C:\Path\YourFile.Dll).FileVersionInfo.FileVersion

这里有一个替代方法,它使用 Get-WmiObjectCIM _ DATAFILE 来选择版本。

(Get-WmiObject -Class CIM_DataFile -Filter "Name='C:\\Windows\\explorer.exe'" | Select-Object Version).Version

我知道这个问题已经得到了回答,但是如果有人对少输入几个字符感兴趣,我相信这是在 PS v3 + 中写这篇文章的最简单的方法:

ls application.exe | % versioninfo
  • lsGet-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
  • flFormat-List的别名

我意识到这与 xcud 的回复非常相似,因为 lsdir都是 Get-ChildItem的别名。但我希望我的“最短”方法能帮到别人。

最后一个例子可以用下面的方式手写:

Get-ChildItem -Filter application.exe -Recurse -ErrorAction SilentlyContinue | ForEach-Object {$_.VersionInfo} | Format-List

... 但我觉得我的方式更酷,对某些人来说,更容易记住。(但大部分更酷)。