Получить номер текущей версии указанной программы

Начал с этого по совету друга

Get-WmiObject win32_product | ft name, version

Но затем я нашел это, что заставляет меня задуматься. Небольшое исследование привело меня к этому

wmic product where "Name='Revit 2018'" get name,version

Что работает, насколько собраны данные. И да, я ищу другую программу в этом примере. в любом случае, как только я получил хорошую информацию с помощью WMIC, я попытался получить данные в переменную, чтобы получить только номер версии, но форматирование данных — это то, чего я никогда раньше не видел. Я надеялся на простое решение, например

$object = wmic product where "Name='Revit 2018'" get name,version
$object.version

Но только результатом является массив с 6 элементами, и только один из них является фактической строкой данных, и это одна строка, а не два свойства. И мне действительно интересно, является ли здесь правильным ответом старая утилита командной строки. Если это действительно лучший способ сделать это, есть ли способ преобразовать необработанные данные во что-то большее, PowerShelly? И если это не лучший способ получить эту информацию, то что? Эта страшная ссылка реальна или Get-WmiObject win32_product действительно безопасен? И если да, то есть ли способ отфильтровать по конкретному имени, чтобы ускорить процесс? И действительно, Get-WmiObject работает не так, как я ожидал, т.к.

$object = Get-WmiObject win32_product | ft name, version
foreach ($item in $object) {
    Write-Host "$($item.version)"
}

Совсем не работает, как ожидалось.

РЕДАКТИРОВАТЬ: Кажется, это работает, как и ожидалось, что является прогрессом.

$version = (Get-WmiObject win32_product -filter:"Name = 'Revit 2018'" | Select-Object -property:*).version
Write-Host "$version!"

Я думаю, вопрос в том, действительно ли это безопасный и последовательный подход или есть лучший?


person Gordon    schedule 04.06.2018    source источник
comment
Я использовал win32_product несколько раз, и результаты всегда были... в лучшем случае непоследовательными. Иногда это работает, а иногда нет. Лучшего метода не нашел   -  person cet51    schedule 04.06.2018
comment
wmic product решает запросить win32_product в конце, так что это не будет иметь значения. Альтернативный подход — запросить реестр.   -  person Mathias R. Jessen    schedule 05.06.2018


Ответы (1)


Почему бы не использовать реестр?

Set-Location HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall
$app = Get-ChildItem | Where-Object { $_.GetValue("DisplayName") -match 'YourSoftware' }

$app.GetValue("DisplayVersion")

Or

Set-Location HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall
$apps = Get-ChildItem
foreach ($app in $apps) {
  $app.GetValue("DisplayName","DisplayVersion")
}

Примечание. Вам также необходимо проверить местоположение реестра SysWow64.

HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\ 

Примечание. Не все элементы будут иметь отображаемую версию, и в этом случае у вас всегда есть возможность поиска в каталоге установки самого исполняемого файла, который должен иметь версию.

person Repeat Daily    schedule 04.06.2018
comment
Думаю, я не верю, что поставщик (в данном случае Autodesk) предоставляет точную информацию. Опять же, WMI вполне может просто собирать ту же (подозрительную) информацию. Время проверить кучу вещей и посмотреть, смогу ли я получить стабильные результаты. - person Gordon; 05.06.2018
comment
@Gordon всегда получал информацию о версии. Если вы ищете последовательность, используя только один подход; либо WMI, либо реестр, то вы будете очень разочарованы, я сожалею об этом. Я думаю, что самый последовательный подход — это получить информацию о версии от самих исполняемых файлов. (Get-Item .\prog.exe).psextended.VersionInfo.ProductVersion - person Repeat Daily; 05.06.2018