![确定已安装的软件](https://linux22.com/image/1615523/%E7%A1%AE%E5%AE%9A%E5%B7%B2%E5%AE%89%E8%A3%85%E7%9A%84%E8%BD%AF%E4%BB%B6.png)
我正在寻找一种方法来确定软件应用程序是否已安装。我看到人们为软件依赖项做了一些方法,但这并不能完全满足我的需要。我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>