6

我试图理解为什么 Powershell 会为 DLL 文件返回与 Windows 资源管理器中的文件属性页面和 WMI 查询显示的不同的版本号。(如果这不能正确地作为编码问题,我提前道歉。)

场景:

运行以下 powershell 命令:

(get-item C:\windows\system32\rdpcorekmts.dll).VersionInfo.ProductVersion

这将返回以下内容:

6.1.7600.16385

但是,此版本号不正确。从 Windows 资源管理器检查版本信息时,您会看到以下版本(抱歉,我尝试发布它的小屏幕截图,但我没有足够的代表;我是新来的):

6.1.7601.17767

此外,WMIC 查询显示与 Windows 资源管理器相同的结果:

WMIC path CIM_DataFile WHERE (name="c:\\windows\\system32\\rdpcorekmts.dll") get Version

WMIC 结果:

版本

6.1.7601.17767

我真的不明白为什么他们会有所不同。我真的很想使用 Powershell 返回这个值,但现在我不确定我是否只是忽略了某些东西,或者我是否遇到了某种奇怪的错误,但是这两种方法之间的版本不匹配令人困惑。需要注意的是,我已经在 Powershell 中运行了一些变体以将其取回(例如 Get-ItemChild 和 Get-ItemProperty),但我得到了相同的错误版本结果。

关于为什么的任何想法?

4

1 回答 1

12

问题是您正在使用ProductVersion似乎在某处硬编码的属性,IE 和 WMI 只是从以下位置构建产品版本:

ProductMajorPart   : 6
ProductMinorPart   : 1
ProductBuildPart   : 7601
ProductPrivatePart : 17767

同样适用FileVersion于:FileMajorPart、FileMinorPart、FileBuildPart、FilePrivatePart

试试看嘛 :

(get-item C:\windows\system32\rdpcorekmts.dll).VersionInfo | fl *

您可以测试:

(get-item C:\windows\system32\rdpcorekmts.dll).VersionInfo | % {("{0}.{1}.{2}.{3}" -f $_.ProductMajorPart,$_.ProductMinorPart,$_.ProductBuildPart,$_.ProductPrivatePart)}

从 CMD.EXE 你可以尝试:

C:\>powershell -command "&{(get-item C:\windows\system32\rdpcorekmts.dll).VersionInfo | % {write-host ('{0}.{1}.{2}.{3}' -f $_.ProductMajorPart,$_.ProductMinorPart,$_.ProductBuildPart,$_.ProductPrivatePart)}}"
于 2012-06-19T03:23:02.103 回答