2012-06-18 5 views
4

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

Сценарий:

Запуск следующей Powershell команды:

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

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

6.1.7600.16385

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

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

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

+0

Там довольно несколько вариантов, которые могут быть получены (Assembly Version, Версия файла, версия продукта). Вы уверены, что расхождение относится к одному и тому же атрибуту? –

ответ

8

Проблема заключается в том, что вы используете ProductVersion СВОЙСТВ который, кажется, трудно закодированы где-то, IE и WMI только buildind версию продукта из:

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)}}" 
+0

Ваше решение работает очень хорошо - спасибо вам.Я ценю, что вы нашли время, чтобы объяснить ответ так тщательно. Весьма признателен! – jschleicher

+0

Еще один вопрос: есть ли способ сделать эту работу через Windows cmd? например powershell -Command "& (get-item C: \ windows \ system32 \ rdpcorekmts.dll) .VersionInfo |% {(" {0}. {1}. {2}. {3} "-f $ _. ProductMajorPart, $ _. ProductMinorPart, $ _. ProductBuildPart, $ _. ProductPrivatePart)} " – jschleicher

+0

Я добавляю строку в ответ – JPBlanc