在PowerShell中获取文件版本

Emp*_*LII 137 powershell file versioninfo

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

我在特别感兴趣File Version,但其他版本信息(也就是Company,Language,Product Name,等)将是有益的为好.

Jay*_*kul 161

现在,您可以从Get-Item或Get-ChildItem获取FileVersionInfo,但它将显示已发布产品的原始FileVersion,而不是更新版本.例如:

(Get-Item C:\Windows\System32\Lsasrv.dll).VersionInfo.FileVersion
Run Code Online (Sandbox Code Playgroud)

有趣的是,您可以使用以下命令获取更新(修补)的ProductVersion:

(Get-Command C:\Windows\System32\Lsasrv.dll).Version
Run Code Online (Sandbox Code Playgroud)

请注意,对于像lsasrv这样的文件(由于2014年11月SSL/TLS/RDS中的安全问题而被替换),这两个命令报告的版本不同,第二个版本是正确的版本.

但是,虽然它在LSASrv中是正确的,但ProductVersion和FileVersion可能是不同的(事实上它很常见).因此,获取更新的 Fileversion 的唯一方法是自己构建它,如下所示:

Get-Item C:\Windows\System32\Lsasrv.dll | ft FileName, File*Part
Run Code Online (Sandbox Code Playgroud)

或者更确切地说,像这样:

[System.Diagnostics.FileVersionInfo]::GetVersionInfo($this.FullName)
Run Code Online (Sandbox Code Playgroud)

现在,每次你做,Get-ChildItem或者Get-Item你将拥有一个FileVersion显示更新的FileVersion 的属性...

  • 为了使这相当于Lars接受的答案,只需使用`(Get-Command C:\ Path\YourFile.Dll).FileVersionInfo.FileVersion` (10认同)
  • **警告**FileVersionInfo.FileVersion是一个字符串表示形式,可能不是最新的.您应该查看FileVersionInfo.FileMajorPart,FileMinorPart,FileBuildPart,FilePrivatePart.请参阅[GetFileVersionInfo()返回错误文件的版本信息](http://stackoverflow.com/a/28700830/2286801) (3认同)
  • 我对应用于 dll 文件的“Get-Command”很感兴趣。能详细说一下它的作用吗? (2认同)
  • @Tydaeus 这并不新鲜。您可以在文档中查找它并查看它可以追溯到多远(.NET 1.1)。我的回答提到了 ProductVersion,但我们使用所有 ScriptProperty 代码计算的版本是真正的文件版本,而不是 ProductVersion。它们有时是相同的,但并非总是如此。不幸的是,我提出的每个实际示例都会在 Windows 的下一个服务版本中进行更改 https://docs.microsoft.com/en-us/dotnet/api/system.diagnostics.fileversioninfo.productversion (2认同)

Lar*_*ens 129

由于PowerShell可以调用.NET类,因此您可以执行以下操作:

[System.Diagnostics.FileVersionInfo]::GetVersionInfo("somefilepath").FileVersion
Run Code Online (Sandbox Code Playgroud)

或者,正如这里要注意文件的列表:

get-childitem * -include *.dll,*.exe | foreach-object { "{0}`t{1}" -f $_.Name, [System.Diagnostics.FileVersionInfo]::GetVersionInfo($_).FileVersion }
Run Code Online (Sandbox Code Playgroud)

甚至更好的脚本:http://jtruher.spaces.live.com/blog/cns!7143DA6E51A2628D!123.entry

  • 请参阅@Jaykul获取不需要.NET对象的解决方案.恕我直言Jaykul的回应应该被选为答案:) (8认同)
  • 尽管其他答案给出的命令更短,但我尝试的所有命令都打印出了太多信息,并将文件路径截断为“ ...”。此答案中的第二个命令给出了您所需要的内容,适用于文件目录,并且以易于查看如何对其进行修改以返回其他信息的方式进行格式化。只需将命令中的.LegalCopyright更改为.FileVersion。 (2认同)
  • 顺便说一下,"这里注明"的链接已经死了. (2认同)

xcu*_*cud 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     :
Run Code Online (Sandbox Code Playgroud)

对于多个文件:

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
Run Code Online (Sandbox Code Playgroud)


Dav*_*dro 16

我更喜欢安装PowerShell社区扩展,只使用它提供的Get-FileVersionInfo函数.

像这样:

Get-FileVersionInfo MyAssembly.dll

输出如:

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

我已经将它用于整个程序集目录并取得了巨大成功.


小智 11

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

(get-item .\filename.exe).VersionInfo | FL
Run Code Online (Sandbox Code Playgroud)

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

(get-item .\filename.exe).VersionInfo.FileVersion
Run Code Online (Sandbox Code Playgroud)

这与dir技术非常接近.


oli*_*are 10

我意识到这已经得到了解答,但是如果有人对输入更少的字符感兴趣,我相信这是在PS v3 +中写这个的最短方式:

ls application.exe | % versioninfo
Run Code Online (Sandbox Code Playgroud)
  • ls 是别名 Get-ChildItem
  • % 是别名 ForEach-Object
  • versioninfo 这是写作的简写方式 {$_.VersionInfo}

ls以这种方式使用的好处是,您可以轻松地调整它以查找子文件夹中的给定文件.例如,以下命令将返回application.exe子文件夹中调用的所有文件的版本信息:

ls application.exe -r | % versioninfo
Run Code Online (Sandbox Code Playgroud)
  • -r 是别名 -Recurse

您可以通过添加-ea silentlycontinue忽略诸如无法搜索的文件夹中的权限错误之类的内容来进一步优化此功能:

ls application.exe -r -ea silentlycontinue | % versioninfo
Run Code Online (Sandbox Code Playgroud)
  • -ea 是别名 -ErrorAction

最后,如果您在结果中获得省略号(...),则可以追加| fl以不同格式返回信息.这会返回更多细节,尽管在列表中进行格式化,而不是每个结果在一行上:

ls application.exe -r -ea silentlycontinue | % versioninfo | fl
Run Code Online (Sandbox Code Playgroud)
  • fl 是别名 Format-List

我意识到这与xcud的回复非常类似,ls并且dir都是别名Get-ChildItem.但我希望我的"最短"方法可以帮助某人.

最后的例子可以用以下方式编写:

Get-ChildItem -Filter application.exe -Recurse -ErrorAction SilentlyContinue | ForEach-Object {$_.VersionInfo} | Format-List
Run Code Online (Sandbox Code Playgroud)

...但我认为我的方式更酷,对某些人来说,更容易记住.(但大多数冷却).


noe*_*cus 7

这是基于其他答案,但正是我所追求的:

(Get-Command C:\Path\YourFile.Dll).FileVersionInfo.FileVersion
Run Code Online (Sandbox Code Playgroud)


EBG*_*een 5

[System.Diagnostics.FileVersionInfo]::GetVersionInfo("Path\To\File.dll")
Run Code Online (Sandbox Code Playgroud)