确定已安装的软件

确定已安装的软件

我正在寻找一种方法来确定软件应用程序是否已安装。我看到人们为软件依赖项做了一些方法,但这并不能完全满足我的需要。我Get-WmiObject在 Powershell 中使用。这是我到目前为止的代码:

#Check for Sophos
$MyApp = Get-WmiObject -Class Win32_Product | sort-object Name | select Name | where { $_.Name -eq "Sophos Endpoint"}

#Logic To Install or Skip
if ($MyApp -eq "Sophos Endpoint"){
    Write-Output "Sophos Endpoint is already installed on this computer."
}
else{
    Write-Output "Sophos Endpoint will be installed quietly in the background"

    #Install Sophos
    SophosSetup.exe --products=antivirus,intercept --quiet
}

我相信我有一个格式问题,这就是为什么我的 if else 语句不能正常工作。

编辑:当 Sophos 存在时,if 语句会跳过 else。我认为问题在于如何Get-WmiObject将输出格式化为变量。它当前输出为:

Name           
----           
Sophos Endpoint

然后 if 语句逻辑就失败了。我需要的Get-WmiObject命令只是将 Sophos Endpoint 输出到 Variable 中$MyApp

答案1

我相信我有一个格式问题,这就是为什么我的 if else 语句不能正常工作。

您实际上遇到了 PowerShell 编程问题。您的变量的内容实际上是下面引用的文本,它并不等同于“Sophos Endpoint”。

Name           
----           
Sophos Endpoint

对于相等运算符来说,以下陈述是正确的。 基本上,由于输入值彼此并不相同,因此您的脚本正在执行其应执行的操作。

当一个或多个输入值与指定模式相同时,相等运算符 (-eq、-ne) 返回 TRUE 值或匹配项。整个模式必须与整个值匹配。

来源:相等运算符

如果找到与正则表达式匹配的内容,则以下脚本将输出变量的值和调试消息。否则,它将仅输出调试消息。

#Check for Sophos
$MyApp = Get-WmiObject -Class Win32_Product | sort-object Name | select Name | where { $_.Name -match "WinZip 24.0"}

if ($MyApp -match "WinZip 24.0")
{
    Write-Output $MyApp.Name
    Write-Output "WinZip is already installed on this computer."
}
else
{
    Write-Output "WinZip is already installed on this computer."
}

在此处输入图片描述

答案2

Get-Object返回一个对象,而不是一个字符串。

您想要的字符串是.Name将成为其中一部分的属性$MyApp(因为您是从的输出中分配它的Get-Object)。

这应该有效:

if ($MyApp.Name -eq "Sophos Endpoint"){`

答案3

另一种方法是从注册表中读取产品信息

我使用以下函数来实现这一点(见下文)

然后你可以简单地这样做:

$isInstalled = Get-AppVersion "Sophos Endpoint"
if(!$isInstalled) { .\SophosSetup.exe --products=antivirus,intercept --quiet }

如果您不太清楚产品的调用方式,该函数还可以处理 RemoteComputers 和通配符搜索。您还可以告诉它您希望返回哪些属性

功能:

function Get-AppVersion {

    param (
        [Parameter(Position = 0)]
        [string]$filter = '*', 
        [string[]]$properties = @("DisplayName", "DisplayVersion", "InstallDate"), 
        [string[]]$ComputerName
    )

    $regpath = @(
        "HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*",
        "HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*"
    )

    $sb = { 
        param ( $regpath, $filter, $properties )
        $regpath | ForEach-Object { Get-ItemProperty $_ } | 
            Where-Object { $_.DisplayName -ne $null -and $_.DisplayName -like $filter } | 
                Select-Object $properties 
    }

    $splat = @{}
    if ($ComputerName) { $splat['ComputerName'] = $ComputerName }

    Invoke-Command -ScriptBlock $sb -ArgumentList $regpath, $filter, $properties @splat

}

以下是一些示例输出:

PS Z:\Powershell-Scripts> Get-AppVersion SwyxIt!

DisplayName DisplayVersion InstallDate
----------- -------------- -----------
SwyxIt!     11.32.3220.0   20181123

PS Z:\Powershell-Scripts> Get-AppVersion *swyx*

DisplayName DisplayVersion InstallDate
----------- -------------- -----------
SwyxIt!     11.32.3220.0   20181123

PS Z:\Powershell-Scripts> Get-AppVersion *swyx* -ComputerName RS

DisplayName    : SwyxIt!
DisplayVersion : 11.32.3220.0
InstallDate    : 20181129
PSComputerName : RS
RunspaceId     : ed097948-c722-4235-aa64-9b0045c5478f


PS Z:\Powershell-Scripts> Get-AppVersion dkgfmnslkf
PS Z:\Powershell-Scripts> Get-AppVersion *swyx* -properties *

AuthorizedCDFPrefix :
Comments            : SwyxIt! macht aus Ihrem PC ein komfortables und leicht zu nutzendes Telefon.
Contact             :
DisplayVersion      : 11.32.3220.0
HelpLink            :
HelpTelephone       :
InstallDate         : 20181123
InstallLocation     : C:\Program Files (x86)\SwyxIt!\
InstallSource       : Z:\Software\q-z\Swyx\SwyxWare 11.32.0.0\SwyxIt!\x64\Deutsch\
ModifyPath          : MsiExec.exe /I{1BA548A7-D32F-4D06-B9A9-451947814967}
Publisher           : Swyx Solutions GmbH
Readme              : C:\Program Files (x86)\SwyxIt!\Readme.rtf
Size                :
EstimatedSize       : 318937
UninstallString     : MsiExec.exe /I{1BA548A7-D32F-4D06-B9A9-451947814967}
URLInfoAbout        :
URLUpdateInfo       : http://www.swyx.de/support/update.html?product=SwyxIt!&version=11.32.3220.0&language=1031
VersionMajor        : 11
VersionMinor        : 32
WindowsInstaller    : 1
Version             : 186649748
Language            : 1031
DisplayName         : SwyxIt!
PSPath              : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall\{1BA548A7-D32F-4D06-B9A9-451947814967}
PSParentPath        : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall
PSChildName         : {1BA548A7-D32F-4D06-B9A9-451947814967}
PSDrive             : HKLM
PSProvider          : Microsoft.PowerShell.Core\Registry


PS Z:\Powershell-Scripts>

相关内容