Powershell get-item VersionInfo.ProductVersion неверен / отличается от WMI

Я пытаюсь понять, почему 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), и я получаю тот же неправильный результат версии.

Любые идеи о том, почему?


person jschleicher    schedule 18.06.2012    source источник
comment
Существует довольно много версий, которые можно получить (версия сборки, версия файла, версия продукта). Вы уверены, что расхождение связано с одним и тем же атрибутом?   -  person Andy Arismendi    schedule 19.06.2012


Ответы (1)


Проблема в том, что вы используете свойство 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)}}"
person JPBlanc    schedule 19.06.2012
comment
Ваше решение работает очень хорошо - большое спасибо. Я ценю, что вы нашли время, чтобы объяснить ответ так подробно. Весьма признателен! - person jschleicher; 19.06.2012
comment
Еще один вопрос: есть ли способ заставить это работать через командную строку Windows? например powershell -Command & (get-item C:\windows\system32\rdpcorekmts.dll).VersionInfo | % {({0}.{1}.{2}.{3} -f $_.ProductMajorPart,$_.ProductMinorPart,$_.ProductBuildPart,$_.ProductPrivatePart)} - person jschleicher; 19.06.2012