Ich suche nach einer Möglichkeit, herauszufinden, ob eine Softwareanwendung bereits installiert ist. Ich habe einige Möglichkeiten gesehen, die Leute für Softwareabhängigkeiten gemacht haben, aber das reicht nicht ganz für das, was ich brauche. Ich verwende es Get-WmiObject
in Powershell. Hier ist mein bisheriger Code:
#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
}
Ich glaube, ich habe ein Formatierungsproblem, weshalb meine if-else-Anweisung nicht richtig funktioniert.
BEARBEITEN: Wenn Sophos vorhanden ist, überspringt die if-Anweisung das else. Ich glaube, das Problem liegt darin, wie Get-WmiObject
die Ausgabe in eine Variable formatiert wird. Derzeit wird Folgendes ausgegeben:
Name
----
Sophos Endpoint
Damit schlägt die Logik der if-Anweisung fehl. Ich brauche den Get-WmiObject
Befehl, um einfach „Sophos Endpoint“ in die Variable auszugeben $MyApp
.
Antwort1
Ich glaube, ich habe ein Formatierungsproblem, weshalb meine if-else-Anweisung nicht richtig funktioniert.
Sie haben tatsächlich ein PowerShell-Programmierproblem. Der Inhalt Ihrer Variable ist tatsächlich der unten zitierte Text, der nicht mit „Sophos Endpoint“ identisch ist.
Name ---- Sophos Endpoint
Die folgende Aussage gilt für Gleichheitsoperatoren. Im Grunde hat Ihr Skript genau das getan, was es sollte, da die Eingabewerte nicht identisch waren.
Die Gleichheitsoperatoren (-eq, -ne) geben den Wert TRUE oder die Übereinstimmungen zurück, wenn einer oder mehrere der Eingabewerte mit dem angegebenen Muster identisch sind. Das gesamte Muster muss mit einem vollständigen Wert übereinstimmen.
Quelle:Gleichheitsoperatoren
Das folgende Skript gibt den Wert der Variablen und die Debugmeldung aus, wenn eine Übereinstimmung mit dem regulären Ausdruck gefunden wird. Andernfalls wird nur eine Debugmeldung ausgegeben.
#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."
}
Antwort2
Get-Object
gibt ein Objekt zurück, keinen String.
Die gewünschte Zeichenfolge ist das .Name
Attribut, das Teil von sein wird $MyApp
(da Sie es aus der Ausgabe von zugewiesen haben Get-Object
).
Das sollte funktionieren:
if ($MyApp.Name -eq "Sophos Endpoint"){`
Antwort3
Eine andere Möglichkeit, das gewünschte Ergebnis zu erzielen, besteht darin, die Produktinformationen aus der Registrierung zu lesen.
Ich verwende dafür folgende Funktion (siehe unten)
Sie könnten dann einfach tun:
$isInstalled = Get-AppVersion "Sophos Endpoint"
if(!$isInstalled) { .\SophosSetup.exe --products=antivirus,intercept --quiet }
Die Funktion kann auch RemoteComputers und Wildcard-Suchen verarbeiten, wenn Sie nicht ganz sicher sind, wie das Produkt heißt. Sie können auch angeben, welche Eigenschaften zurückgegeben werden sollen
Die Funktion:
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
}
Hier sind einige Beispielausgaben:
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>