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

我特别感兴趣 File Version, ,尽管其他版本信息(即 Company, Language, Product Name, 等)也会有帮助。

有帮助吗?

解决方案

由于PowerShell可以调用 。网 类,您可以执行以下操作:

[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!125.entry

其他提示

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

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

有趣的是,您可以获得更新(修补) 产品版本 通过使用这个:

(Get-Command C:\Windows\System32\Lsasrv.dll).Version

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

然而,尽管在 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 的属性...

'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 的回复非常相似 lsdir 都是别名 Get-ChildItem. 。但我希望我的“最短”方法能帮助别人。

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

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

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

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

(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
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top