Determinar el software que ya está instalado

Determinar el software que ya está instalado

Estoy buscando una manera de descubrir cómo determinar si una aplicación de software ya está instalada. Vi algunas formas en que la gente lo ha hecho para las dependencias de software, pero eso no hace lo que necesito. Estoy usando Get-WmiObjectPowershell. Aquí está mi código hasta ahora:

#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
}

Creo que tengo un problema de formato y es por eso que mi declaración if else no funciona correctamente.

EDITAR: Cuando Sophos está presente, la declaración if omite la demás. Creo que el problema es cómo Get-WmiObjectse formatea la salida en una variable. Actualmente sale como:

Name           
----           
Sophos Endpoint

Lo que luego falla en la lógica de la declaración if. Necesito el Get-WmiObjectcomando para generar Sophos Endpoint en la Variable $MyApp.

Respuesta1

Creo que tengo un problema de formato y es por eso que mi declaración if else no funciona correctamente.

De hecho, tienes un problema de programación de PowerShell. El contenido de su variable es en realidad el texto citado a continuación, que no equivale a "Sophos Endpoint".

Name           
----           
Sophos Endpoint

La siguiente afirmación es cierta para los operadores de igualdad. Básicamente, su secuencia de comandos estaba haciendo exactamente lo que se suponía que debía hacer, ya que los valores de entrada no eran idénticos entre sí.

Los operadores de igualdad (-eq, -ne) devuelven un valor VERDADERO o las coincidencias cuando uno o más de los valores de entrada son idénticos al patrón especificado. Todo el patrón debe coincidir con un valor completo.

Fuente:Operadores de igualdad

El siguiente script generará el valor de la variable y el mensaje de depuración si se encuentra una coincidencia con la expresión regular. De lo contrario, solo generará un mensaje de depuración.

#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."
}

ingrese la descripción de la imagen aquí

Respuesta2

Get-Objectdevuelve un objeto, no una cadena.

La cadena que desea es el .Nameatributo del que formará parte $MyApp(ya que lo asignó desde la salida de Get-Object).

Esto debería funcionar:

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

Respuesta3

Otra forma de hacer lo que quieres es leer la información del producto en el registro.

Utilizo la siguiente función para eso (ver más abajo)

entonces podrías simplemente hacer:

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

La función también puede manejar RemoteComputers y búsqueda con comodines, si no está muy seguro de cómo se llama el producto. También puede indicarle qué propiedades desea que le devuelvan.

La función:

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

}

A continuación se muestran algunos resultados de ejemplo:

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>

información relacionada