检查是否安装了特定版本的程序

时间:2018-10-17 13:48:03

标签: windows powershell scripting installed-applications

我正在尝试创建一个非常简单的脚本,该脚本将检查是否安装了特定程序,如果已安装,则返回该程序的版本号。

我已经到达运行脚本的地步,并且无论是否安装了程序都可以返回二进制值,但是不确定如何返回已安装程序的版本号。

>

如果安装了程序,我将要返回的内容就是我要做的事情,并且需要帮助才能获得版本号。

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 :(得分:3)

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

答案 1 :(得分:3)

代替格式化表格后进行匹配,您可以添加一个位置来预先选择所需的结果,然后直接从该对象获取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

答案 2 :(得分:2)

如果您希望该函数查找特定的已安装程序,而不是返回(表)格式的字符串,则只需执行以下操作:

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的版本

答案 3 :(得分:1)

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匹配;请注意,可能有多个条目匹配。

可以在this 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 cmdlet检查已安装的程序;在PSv3和PSv4中,它是available as a download

要列出已安装的程序(以节略的示例输出显示):

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软件包提供程序在v6的Windows的PowerShell Core 可用。 1.0-目前尚不清楚这是不是一种情况还是永远不会发生。