Получаемый элемент 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)}}"