Powershell get-item VersionInfo.ProductVersion不正确/不同于WMI

jsc*_*her 5 powershell wmi-query versioninfo wmic

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

场景:

运行以下powershell命令:

(get-item C:\windows\system32\rdpcorekmts.dll).VersionInfo.ProductVersion
Run Code Online (Sandbox Code Playgroud)

这将返回以下内容:

6.1.7600.16385

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

6.1.7601.17767

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

WMIC path CIM_DataFile WHERE (name="c:\\windows\\system32\\rdpcorekmts.dll") get Version
Run Code Online (Sandbox Code Playgroud)

WMIC结果:

6.1.7601.17767

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

有什么想法吗?

JPB*_*anc 10

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

ProductMajorPart   : 6
ProductMinorPart   : 1
ProductBuildPart   : 7601
ProductPrivatePart : 17767
Run Code Online (Sandbox Code Playgroud)

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

试一试 :

(get-item C:\windows\system32\rdpcorekmts.dll).VersionInfo | fl *
Run Code Online (Sandbox Code Playgroud)

你可以测试:

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

从CMD.EXE您可以尝试:

C:\>powershell -command "&{(get-item C:\windows\system32\rdpcorekmts.dll).VersionInfo | % {write-host ('{0}.{1}.{2}.{3}' -f $_.ProductMajorPart,$_.ProductMinorPart,$_.ProductBuildPart,$_.ProductPrivatePart)}}"
Run Code Online (Sandbox Code Playgroud)