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

Windows 检查是否安装了具有特定版本的程序,windows,powershell,scripting,installed-applications,Windows,Powershell,Scripting,Installed Applications,我正在尝试创建一个非常简单的脚本,它将检查是否安装了特定程序,如果安装了,则返回该程序的版本号 我已经能够在运行脚本时返回一个二进制值(如果程序安装或未安装),但不确定如何返回已安装程序的版本号 如果安装了该程序,并且需要获得版本号方面的帮助,那么我将发布的内容就是我正在执行的返回操作 function Check_Program_Installed { $my_check = Get-ItemProperty HKLM:\Software\Wow6432Node\Microsoft\W

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

我已经能够在运行脚本时返回一个二进制值(如果程序安装或未安装),但不确定如何返回已安装程序的版本号

如果安装了该程序,并且需要获得版本号方面的帮助,那么我将发布的内容就是我正在执行的返回操作

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

如果要查看所有程序,则不必添加参数。只需将其输出传输到
格式表
。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

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

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

,而不是在格式化表格后进行匹配,您可以添加一个位置,以便事先选择所需的结果,然后直接从该对象获取
DisplayVersion
。您可以对其进行更多的清理,以完全满足您的需要,但下面是您的代码修改,以便在找到应用程序时检索并显示数字。尝试切换到坏名称以查看
else
结果:

function Get-ApplicationVersion {

    $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"
    }

}

Get-ApplicationVersion
编辑:根据建议,从
检查安装的程序中重命名函数名,以使用PS通用动词
获取

tl;dr

Windows PowerShell[1]v5.1+中,使用以下命令(在32位和64位安装的程序中进行搜索,如控制面板中所示):

注意:仅32位的
HKEY\U LOCAL\U计算机:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall
注册表项可能比“控制面板”中显示的注册表项具有更多的特定项-我不清楚原因,但“控制面板”中的复合视图可能就足够了

适用于您的示例:

PS> (Get-Package -ProviderName Programs -IncludeWindowsInstaller '*Google Chrome*').Version
70.0.3538.67

至于你所尝试的:

由于您正在检查
Wow6432Node
注册表项分支,因此只检查已安装的32位程序

因此,更好的函数名称应该是
Check\u 32BitProgram\u Installed
,或者更符合函数意图的
Get-32BitProgramVersion


根据您问题的一般标题,上述解决方案基本上搜索了您将在“控制面板>程序>程序和功能”(
appwiz.cpl
)中看到的已安装应用程序列表,其中包括32位和64位应用程序:

Windows PowerShell v5.1附带了
软件包管理
模块和
程序
软件包提供程序
[1],允许通过
获取软件包
cmdlet检查已安装的程序;在PSv3和PSv4中,可以执行以下操作:

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

输出对象的类型为
[Microsoft.PackageManagement.Packaging.SoftwareIdentity]
,具有
.Name
.Version
属性,可启用上述解决方案

程序
程序包提供程序支持两个动态选项(特定于该提供程序的选项):

  • -需要includeIndowsInstaller
    ,以使报告的程序列表与控制面板显示的程序匹配

  • -IncludeSystemComponent
    ,相比之下,它报告的是控制面板中未显示的组件



[1] 不幸的是,从v7.0开始,Windows上的PowerShell Core中没有底层的
程序
包提供程序,我不清楚这是一种尚未出现的情况,还是永远不会出现这种情况。

Check\u Program\u Installed使用了非默认动词,因此不是推荐的函数名称。使用Get Verb查看可接受动词的列表。我从用户的问题中复制了名称,以使我的答案尽可能简单易懂,但我理解您的反馈并对其进行了修改。谢谢你的推荐。
Get-Package -ProviderName Programs -IncludeWindowsInstaller '*Google Chrome*' |
  ForEach-Object Version
PS> (Get-Package -ProviderName Programs -IncludeWindowsInstaller '*Google Chrome*').Version
70.0.3538.67
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                                                                      
# ...