Проверьте, установлена ​​ли программа с определенной версией - PullRequest
0 голосов
/ 17 октября 2018

Я пытаюсь создать очень простой скрипт, который бы проверял, установлена ​​ли конкретная программа, и если да, возвращает номер версии для этой программы.

Мне удалось добраться до точки, где я запускаю сценарий и могу вернуть двоичное значение, если программа установлена ​​или нет, но не знаю, как вернуть номер версии для этой установленной программы..

То, что я опубликую, будет именно тем, что я делаю, чтобы вернуться, если программа установлена, и нужна помощь в получении номера версии.

function Check_Program_Installed {
    $my_check = Get-ItemProperty HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\* |
                Select-Object DisplayName, DisplayVersion, InstallDate |
                Format-Table -AutoSize |
                Out-String

    # Check if Google Chrome is installed
    $my_check -Match "Google Chrome"
}

Check_Program_Installed

enter image description here

Ответы [ 4 ]

0 голосов
/ 17 октября 2018

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 - и мне неясно, будет ли это еще не ситуация или никогда не будет.

0 голосов
/ 17 октября 2018

Если вы хотите, чтобы эта функция искала определенную установленную программу вместо возврата строки (таблицы) в формате, тогда вы можете просто сделать:

function Check_Program_Installed {
    [CmdletBinding()]
    Param(
        [Parameter(Position = 0, Mandatory=$true, ValueFromPipeline = $true)]
        $Name
    )
    $app = Get-ItemProperty -Path "HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*" | 
                Where-Object { $_.DisplayName -match $Name } | 
                Select-Object DisplayName, DisplayVersion, InstallDate, Version
    if ($app) {
        return $app.DisplayVersion
    }
}

Check_Program_Installed "Google Chrome"

Это вернет $null, если не найдено,или версия в виде строки типа 70.0.3538.67

0 голосов
/ 17 октября 2018

Вместо того, чтобы выполнять сопоставление после форматирования таблицы, вы можете добавить, где заранее выбрать нужный результат, а затем получить DisplayVersion непосредственно из этого объекта.Вы можете очистить это больше, чтобы делать именно то, что вам нужно, но вот ваш код, модифицированный для извлечения и отображения номера, если приложение найдено.Попробуйте перейти на плохое имя, чтобы увидеть результат else:

function Check_Program_Installed {

    $applicationName = "Google Chrome"

    $my_check = Get-ItemProperty HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\* | Select-Object DisplayName, DisplayVersion, InstallDate | Where -Property DisplayName -Match $applicationName

    $versionNumber = $my_check.DisplayVersion

    if ($my_check) {
        $versionNumber
    }
    else {
        write-warning "Application not found"
    }

}

Check_Program_Installed
0 голосов
/ 17 октября 2018
function Get-InstalledProgram {
    Param (
        $ProgramName
    )

    $UninstallKeys = Get-ItemProperty HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\* 

    if ( $ProgramName )
    {
        $UninstallKeys | Where-Object -Property DisplayName -Match -Value $ProgramName | Select-Object DisplayName, DisplayVersion, InstallDate
    }
    else
    {
        $UninstallKeys | Select-Object DisplayName, DisplayVersion, InstallDate
    }
}

Если вы хотите увидеть все программы, вам не нужно добавлять параметр.Просто направьте его вывод на Format-Table.Format-Table делает некоторые странные вещи, когда элементы больше не ожидаемые объекты, а объекты таблицы.Вот как бы я справился с этим:

Get-InstalledProgram | Format-Table -Autosize

Если вы хотите найти программу, добавьте параметр.Вы увидите выше, я добавил параметр для ProgramName.Это будет соответствовать этому термину для DisplayName ключа реестра.

PS C:\> Get-InstalledProgram -ProgramName Java

DisplayName       DisplayVersion InstallDate
-----------       -------------- -----------
Java 8 Update 181 8.0.1810.25    20180725   
Java Auto Updater 2.8.181.13     20180925  

Если вы хотите просто получить версию, я бы порекомендовал просто передать ваш вывод в Select-Object -ExpandProperty DisplayVersion

PS C:\> Get-InstalledProgram -ProgramName 'Java 8' | Select-Object -ExpandProperty DisplayVersion
8.0.1810.25
...