我正在尋找一種方法來確定如何確定軟體應用程式是否已安裝。我看到人們為軟體依賴關係做到了一些方法,但這並不能完全滿足我的需要。我正在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 }
如果您不太確定如何呼叫該產品,該函數還可以處理遠端電腦和通配符搜尋。您也可以告訴它您想要傳回哪些屬性
功能:
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>