Ermitteln der bereits installierten Software

Ermitteln der bereits installierten Software

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-WmiObjectin 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-WmiObjectdie 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-WmiObjectBefehl, 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."
}

Bildbeschreibung hier eingeben

Antwort2

Get-Objectgibt ein Objekt zurück, keinen String.

Die gewünschte Zeichenfolge ist das .NameAttribut, 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>

verwandte Informationen