2

为什么会System.Diagnostics.FileVersionInfo.GetVersionInfo()返回意外的文件版本信息?我正在寻找有关 MPIO 驱动程序的版本信息。目标操作系统是 Server 2008R2 SP1,它应该返回 FileVersion 6.1.7601。取而代之的是,我得到了 6.1.7600 的 2008R2 RTM 版本。

除了不正确的文件版本之外,OriginalFilename 也不是我所期望的。它是 mpio.sys.mui,尽管 FileName 是正确的。

使用资源管理器检查文件属性时会显示正确的版本信息。

这是设计使然,错误还是我使用 FileVersionInfo 错误的方式?是否有任何解决方法,最好是在 Powershell 上?

$mpioPath = 'c:\windows\system32\drivers\mpio.sys'
$v = [System.Diagnostics.FileVersionInfo]::GetVersionInfo($mpioPath)
$v | fl -Property *

Comments           :
CompanyName        : Microsoft Corporation
FileBuildPart      : 7601
FileDescription    : MultiPath Support Bus-Driver
FileMajorPart      : 6
FileMinorPart      : 1
FileName           : c:\windows\system32\drivers\mpio.sys
FilePrivatePart    : 17619
FileVersion        : 6.1.7600.16385 (win7_rtm.090713-1255)
InternalName       : mpio.sys
IsDebug            : False
IsPatched          : False
IsPrivateBuild     : False
IsPreRelease       : False
IsSpecialBuild     : False
Language           : English (United States)
LegalCopyright     : © Microsoft Corporation. All rights reserved.
LegalTrademarks    :
OriginalFilename   : mpio.sys.mui
PrivateBuild       :
ProductBuildPart   : 7601
ProductMajorPart   : 6
ProductMinorPart   : 1
ProductName        : Microsoft® Windows® Operating System
ProductPrivatePart : 17619
ProductVersion     : 6.1.7600.16385
SpecialBuild       :

使用 C# 程序可以实现相同的结果,因此这似乎更多的是 .Net 功能而不是 Powershell 特定的功能。

namespace Foo {
  class GetFileVersionInfo {
    static void Main(string[] args) {
      string mpio = @"c:\windows\system32\drivers\mpio.sys";
      System.Diagnostics.FileVersionInfo fvInfo;
      fvInfo = System.Diagnostics.FileVersionInfo.GetVersionInfo(mpio);
      System.Console.WriteLine("Original file name: " + fvInfo.OriginalFilename);
      System.Console.WriteLine("FileVersion: " + fvInfo.FileVersion);
    }
  }
}

使用 FileVer.exe 返回正确的版本信息:

filever $mpioPath
--a-- W32  DRV ENU  6.1.7601.17619 shp    156,544 05-20-2011 mpio.sys

如果没有其他方法,我可以使用 FileVer 并解析它的输出。

4

3 回答 3

2

GetFileVersionInfo 的 MSDN 页面上,它说:

文件版本信息有固定和非固定部分。固定部分包含版本号等信息。非固定部分包含字符串之类的东西。过去 GetFileVersionInfo 从二进制文件 (exe/dll) 中获取版本信息。目前,它正在从语言中性文件(exe/dll)中查询固定版本和从mui文件中查询非固定部分,合并它们并返回给用户。

所以这与您所看到的完全一致:一个版本号来自c:\windows\system32\drivers\mpio.sys,另一个来自c:\windows\system32\drivers\[your language]\mpio.sys.mui

于 2014-02-28T11:42:52.560 回答
2

我猜 FileVer.exe 和 expolrer.exe 做的和你在 powershell 中做的一样:

$mpioPath = 'c:\windows\system32\drivers\mpio.sys'
$v = [System.Diagnostics.FileVersionInfo]::GetVersionInfo($mpioPath)

$ver = "{0}.{1}.{2}.{3}" -f $v.FileMajorPart, $v.FileMinorPart, $v.FileBuildPart, $v.FilePrivatePart
于 2013-01-25T14:01:30.630 回答
1

To my knowlege the fields "FileVersion" and "ProductVersion" are unicode strings. In contrast the fields "FileMajorPart", "FileMinorPart", "FileBuildPart" and "FilePrivatePart" are DWORD values. The fields "ProductMajorPart", "ProductMinorPart", "ProductBuildPart" and "ProductPrivatePart" are DWORD values too:

http://msdn.microsoft.com/en-us/library/windows/desktop/ms646997%28v=vs.85%29.aspx

The applications used to create the VersionBlock might allow inconsistencies between the strings and the DWORD fields. Some versions of Visual Studio for example will always update the DWORD fields to reflect the changes made to the strings. However an update to the DWORD value alone does not reflect in the strings. Thus depending on the applications used for coding different degrees of inconsistencies are possible. In my experience you will get the best results with the DWORD fields alone (as it has been proposed in the answer to your question).

于 2013-12-22T19:50:00.130 回答