tl; dr
В Windows PowerShell [1] v5 + используйте следующее (поиск среди обоих 32-разрядные и 64-разрядные установленные программы, как показано на панели управления):
Get-Package -ProviderName Programs -IncludeWindowsInstaller |
Where-Object Name -like '*Google Chrome*' | ForEach-Object Version
Примечание: 32-разрядные HKEY_LOCAL_MACHINE:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall
могут иметь более конкретные записи, чем панель управленияпоказывает - мне неясно, почему, но, возможно, достаточно составного представления в панели управления.
Обернут в простую функцию , которая возвращает полные объекты:
function Get-InstalledProgram ([string] $NamePart) {
Get-Package -ProviderName Programs -IncludeWindowsInstaller |
Where-Object Name -like ('*' + $NamePart + '*')
}
Без аргумента -NamePart
выводятся всех установленных программ.Аргумент -NamePart
может быть любой подстрокой имени программы, потому что предоставленная строка заключена в *...*
внутри функции и соответствует -like
;обратите внимание, что несколько записей могут совпадать.
Более сложная версия этой функции, которая поддерживает несколько подстрок имен, может быть найдена в этой Gist .
Применительно к вашему примеру:
PS> (Get-InstalledProgram 'Google Chrome').Version
70.0.3538.67
Поскольку вы специально проверяете ветку ключа реестра Wow6432Node
, вы проверяете только установленные 32-битные программы.
Таким образом, лучшим названием для вашей функции будет Check_32BitProgram_Installed
или, в большей степени, в соответствии с намерением функции, Get-32BitProgramVersion
.
Учитывая общее название вашего вопроса, приведенное вышерешение, которое по существу выполняет поиск в списке установленных приложений, которые вы видите в Панели управления> Программы> Программы и компоненты (appwiz.cpl
), который охватывает как 32-разрядные, так и 64-разрядные приложения:
Windows PowerShell v5 + поставляется с PackageManagement
модулем и Programs
поставщиком пакетов [1] , который позволяет проверять установленные программы через Get-Package
командлет;в PSv3 и PSv4 доступно для загрузки .
Для просмотра списка установленных программ (показано с сокращенным примером вывода):
PS> Get-Package -ProviderName Programs -IncludeWindowsInstaller
Name Version Source ProviderName
---- ------- ------ ------------
Git version 2.18.0 2.18.0 Programs
Microsoft Azure Compute Emu... 2.9.8699.20 Programs
Microsoft Azure Authoring T... 2.9.8699.20 Programs
# ...
Выходные объекты имеютвведите [Microsoft.PackageManagement.Packaging.SoftwareIdentity]
, который имеет свойства .Name
и .Version
, что позволяет использовать вышеуказанные решения.
Поставщик пакета Programs
поддерживает две динамические опции (опции, специфичные для этого поставщика):
-IncludeWindowsInstaller
необходимо для того, чтобы список представленных программ соответствовал отображаемому на панели управления.
-IncludeSystemComponent
, напротив, сообщает компоненты, которые не показать на панели управления.
[1] К сожалению, базовый поставщик пакетов Programs
не доступенв PowerShell Core в Windows начиная с v6.1.0 - и мне неясно, будет ли это еще не ситуация или никогда не будет.