Получаемый элемент Powershell VersionInfo.ProductVersion неверен / отличается от WMI

Я пытаюсь понять, почему Powershell может получить другой номер версии для DLL-файла, чем тот, который отображается на странице свойств файла из Windows Explorer и в запросе WMI. (Я прошу прощения заранее, если это не правильно квалифицировать как вопрос кодирования.)

Сценарий:

Выполнение следующей команды powershell:

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

Это возвращает следующее:

6.1.7600.16385

Однако этот номер версии неверен. При просмотре информации о версии из Windows Explorer вы видите следующую версию (извините, я попытался опубликовать небольшой скриншот, но мне не хватает представителя; я новичок здесь):

6.1.7601.17767

Кроме того, запрос WMIC показывает те же результаты, что и Windows Explorer:

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

Результат WMIC:

Версия

6.1.7601.17767

Я действительно не понимаю, почему они будут другими. Я действительно хотел бы вернуть это значение с помощью Powershell, но теперь я не уверен, что я просто что-то пропускаю или столкнулся с какой-то странной ошибкой, но несоответствие версий между двумя методами сбивает с толку. Как примечание, я запустил варианты метода, чтобы вернуть его обратно в Powershell (например, Get-ItemChild и Get-ItemProperty), и я получил тот же неверный результат версии.

Есть идеи, почему?

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)}}"
Другие вопросы по тегам