Búsqueda de sitios web

PowerShell comprueba si el software está instalado [2 formas]


Usando Get-Package con el cmdlet Select-Object

Utilice Get-Package con el cmdlet Select-Object para comprobar si el software especificado está instalado.

Utilice Get-Package con el cmdlet Select-Object:

$software = "Java(TM) SE Development Kit 18.0.2.1 (64-bit)"
Get-Package | Where-Object { $_.Name -eq $software } | Select-Object Name, Version

PRODUCCIÓN :

Java(TM) SE Development Kit 18.0.2.1 (64-bit)

Primero, declaramos e inicializamos una variable llamada $software que tenía el nombre completo de un software que queríamos verificar.

A continuación, utilizamos el cmdlet Get-Package para recuperar una lista de todos los paquetes instalados en nuestra computadora local; todos estos paquetes se canalizaron al cmdlet Where-Object que verificaba si la propiedad Name es igual al valor de la variable $software; si es así, canalizó el resultado al cmdlet Select-Object, que seleccionó el $software especificado entre ellos y los devolvió; de lo contrario, no mostró nada.

También podemos ejecutar el cmdlet Get-Package en máquinas remotas ejecutándolo como parte del cmdlet Invoke-Command o Enter-PSSession. o guión.

También podemos verificar todas las versiones de un software en particular proporcionado por un proveedor. Usamos el cmdlet Get-Package con los parámetros -ProviderName y -AllVersions.

Utilice Get-Package con -ProviderName y -AllVersions:

Get-Package -Name "Python*"-ProviderName msi -AllVersions

PRODUCCIÓN :

Name                           Version          Source                           ProviderName
----                           -------          ------                           ------------
Python Launcher                3.11.7966.0                                       msi
Python 3.11.0 Standard Libr... 3.11.150.0                                        msi
Python 3.11.0 Core Interpre... 3.11.150.0                                        msi
Python 3.10.6 Add to Path (... 3.10.6150.0                                       msi
Python 3.11.0 Utility Scrip... 3.11.150.0                                        msi
Python 3.10.6 Standard Libr... 3.10.6150.0                                       msi
Python 3.10.6 Test Suite (6... 3.10.6150.0                                       msi
Python 3.11.0 Tcl/Tk Suppor... 3.11.150.0                                        msi
Python 3.10.6 Executables (... 3.10.6150.0                                       msi
Python 3.10.6 Utility Scrip... 3.10.6150.0                                       msi
Python 3.11.0 Documentation... 3.11.150.0                                        msi
Python 3.10.6 Documentation... 3.10.6150.0                                       msi
Python 3.11.0 Test Suite (6... 3.11.150.0                                        msi
Python 3.10.6 Tcl/Tk Suppor... 3.10.6150.0                                       msi
Python 3.10.6 Core Interpre... 3.10.6150.0                                       msi
Python 3.11.0 pip Bootstrap... 3.11.150.0                                        msi
Python 3.10.6 Development L... 3.10.6150.0                                       msi
Python 3.11.0 Add to Path (... 3.11.150.0                                        msi
Python 3.11.0 Executables (... 3.11.150.0                                        msi
Python 3.10.6 pip Bootstrap... 3.10.6150.0                                       msi
Python 3.11.0 Development L... 3.11.150.0                                        msi

Ya hemos aprendido sobre Get-Package; Aquí usamos este cmdlet con el parámetro -ProviderName para mencionar el nombre del proveedor, que era msi en el ejemplo anterior. A continuación, utilizamos el parámetro -Name para mencionar el nombre del software; sin embargo, el operador comodín representado con * se usó para capturar todo el software que comenzaba con la palabra Python.

A continuación, utilizamos el parámetro -AllVersions para recuperar todas las versiones de software instaladas en la máquina local. De forma predeterminada, el cmdlet Get-Package devuelve la última versión disponible. Para enumerar una versión de software en particular, utilizamos -RequiredVersion seguido del número de versión. Consulte el siguiente ejemplo para una comprensión clara.

Utilice Get-Package con -ProviderName y -RequiredVersion:

Get-Package -Name "Python*"-ProviderName msi -RequiredVersion 3.11.150.0

PRODUCCIÓN :

Name                           Version          Source                           ProviderName
----                           -------          ------                           ------------
Python 3.11.0 Standard Libr... 3.11.150.0                                        msi
Python 3.11.0 Core Interpre... 3.11.150.0                                        msi
Python 3.11.0 Utility Scrip... 3.11.150.0                                        msi
Python 3.11.0 Tcl/Tk Suppor... 3.11.150.0                                        msi
Python 3.11.0 Documentation... 3.11.150.0                                        msi
Python 3.11.0 Test Suite (6... 3.11.150.0                                        msi
Python 3.11.0 pip Bootstrap... 3.11.150.0                                        msi
Python 3.11.0 Add to Path (... 3.11.150.0                                        msi
Python 3.11.0 Executables (... 3.11.150.0                                        msi
Python 3.11.0 Development L... 3.11.150.0                                        msi

Si desea saber qué paquetes (software) están instalados en su computadora local, simplemente ejecutamos el cmdlet Get-Package como se muestra a continuación. Mostrará el Nombre, Versión, Fuente y ProviderName del software; vea el siguiente resultado.

Utilice el cmdlet Obtener paquete:

Get-Package

PRODUCCIÓN :

Name                           Version          Source                           ProviderName
----                           -------          ------                           ------------
Greenshot 1.2.10.6             1.2.10.6                                          Programs
Office 16 Click-to-Run Exte... 16.0.16130.20218                                  msi
Office 16 Click-to-Run Lice... 16.0.16130.20218                                  msi
Microsoft Update Health Tools  3.70.0.0                                          msi
Apache NetBeans IDE 15         15                                                Programs
Node.js                        18.12.1                                           msi
Microsoft Visual C++ 2019 X... 14.28.29325                                       msi
Microsoft Visual C++ 2019 X... 14.28.29325                                       msi
Java(TM) SE Development Kit... 18.0.2.1         C:\Program Files\Java\jdk-18.... msi
...                            ...              ...                              ...
...                            ...              ...                              ...
...                            ...              ...                              ...

Puede existir la posibilidad de que tenga que averiguar la ubicación de instalación del software especificado; en ese caso, usamos el Get-Package con el cmdlet Select-Object de la siguiente manera.

Utilice Get-Package con el cmdlet Select-Object:

$software = "Java(TM) SE Development Kit 18.0.2.1 (64-bit)"
Get-Package -Name $software | Select-Object -ExpandProperty Source

PRODUCCIÓN :

C:\Program Files\Java\jdk-18.0.2.1\

Ya hemos aprendido sobre Get-Package y Select-Object; lo nuevo es el parámetro -ExpandProperty que usamos para especificar la propiedad que queríamos seleccionar. Entonces, por ejemplo, en el código anterior, seleccionamos la propiedad source para conocer la ubicación de instalación del $software especificado.

Usando Get-WmiObject con el cmdlet Select-Object

Utilice Get-WmiObject con el cmdlet Select-Object para comprobar si el software especificado está instalado.

Utilice Get-WmiObject con Select-Object:

$software = "Java(TM) SE Development Kit 18.0.2.1 (64-bit)"
Get-WmiObject -Class Win32_Product | Where-Object { $_.Name -eq $software } | Select-Object $software

PRODUCCIÓN :

Java(TM) SE Development Kit 18.0.2.1 (64-bit)

Este ejemplo es similar al primer ejemplo de la sección anterior, pero utilizamos el cmdlet Get-WmiObject con el parámetro -Class para el fragmento de código anterior. Este cmdlet recuperó todas las instancias de la clase WMI (Instrumental de administración de Windows) o información sobre las clases disponibles.

El uso de este cmdlet como Get-WmiObject -Class Win32_Product devolvió una lista de todo el software instalado en el sistema Windows mediante WMI. Podemos ejecutar este comando en cualquier sistema Windows con PowerShell instalado y obtener detalles sobre todos los paquetes instalados, incluido el nombre del software, el proveedor, la versión y otra información importante.

Recuerde, usar Get-WmiObject puede ser lento y consumir muchos recursos, particularmente cuando tenemos un sistema con muchos software/paquetes instalados. ¿Por qué es lento? Esto se debe a que tiene que consultar la base de datos WMI para cada software instalado. Además, pocos programas antivirus pueden identificarlo como un comando malicioso, ya que el malware lo utiliza con frecuencia para recopilar información sobre los paquetes instalados en un sistema en particular. Debe tener cuidado al utilizar esto y solo en sistemas confiables.

Ahora, modifiquemos el código anterior como se muestra a continuación.

Utilice Get-WmiObject con Select-Object:

$software = "Java(TM) SE Development Kit 18.0.2.1 (64-bit)"
$result = Get-WmiObject -Query "SELECT * FROM Win32_Product WHERE Name = '$software'"
if ($result -ne $null){
    Write-Host "'$software' is installed."
}
else{
    Write-Host "'$software' is not installed."
}

PRODUCCIÓN :

'Java(TM) SE Development Kit 18.0.2.1 (64-bit)' is installed.

Aquí, inicializamos la variable $result con el valor devuelto por el comando Get-WmiObject. A continuación, utilizamos la instrucción if con el operador -ne para comprobar si $result no es igual a $null; si no es así, utilizamos Write-Host para mostrar un mensaje personalizado informando que el software especificado está instalado; de lo contrario, se ejecutará el bloque else.

Ahora conocemos el cmdlet Get-WmiObject, por qué lo usamos y qué devuelve. Usemos otro ejemplo de código pero esta vez con función.

Demostración de cómo obtener la base de datos de consultas Get-WmiObject:

function Check_Software_Installed( $software ) {
$wmi_check = (Get-WmiObject -Query "SELECT * FROM Win32_Product Where Name='$software'")
return $wmi_check;
}
Check_Software_Installed("Java(TM) SE Development Kit 18.0.2.1 (64-bit)")

PRODUCCIÓN :

IdentifyingNumber : {F3A2A837-F83B-5732-97F2-309BE0F51E0C}
Name              : Java(TM) SE Development Kit 18.0.2.1 (64-bit)
Vendor            : Oracle Corporation
Version           : 18.0.2.1
Caption           : Java(TM) SE Development Kit 18.0.2.1 (64-bit)

Obtuvimos Proveedor, Versión, Caption, Nombre y IdentifyingNumber porque usamos * en el comando SQL SELECT. Entonces podemos obtener la misma información para todos los paquetes instalados de la siguiente manera.

Utilice el cmdlet Get-WmiObject:

Get-WmiObject -Class Win32_Product

PRODUCCIÓN :

IdentifyingNumber : {89581302-705F-42C5-99B0-E368A845DAD5}
Name              : Microsoft Update Health Tools
Vendor            : Microsoft Corporation
Version           : 3.70.0.0
Caption           : Microsoft Update Health Tools

IdentifyingNumber : {7B9BAA62-C960-4309-A639-28FC9877FF68}
Name              : Node.js
Vendor            : Node.js Foundation
Version           : 18.12.1
Caption           : Node.js

IdentifyingNumber : {F3A2A837-F83B-5732-97F2-309BE0F51E0C}
Name              : Java(TM) SE Development Kit 18.0.2.1 (64-bit)
Vendor            : Oracle Corporation
Version           : 18.0.2.1
Caption           : Java(TM) SE Development Kit 18.0.2.1 (64-bit)
...               ...
...               ...
...               ...

Usando el cmdlet Get-ChildItem

Para verificar todo el software instalado en PowerShell:

  • Utilice el cmdlet Get-ChildItem para consultar el registro y recuperar una lista de todos los paquetes (software) instalados.
  • Utilice el bucle ForEach para iterar sobre la lista de paquetes instalados.
  • En cada iteración:

    • Utilice Write-Host tres veces para mostrar el DisplayName del software, un separador y el DisplayVersion.

Utilice el cmdlet Get-ChildItem:

$installedSoftware = Get-ChildItem "HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall"
foreach($object in $installedSoftware){
    Write-Host $object.GetValue('DisplayName') -NoNewline;
    Write-Host " - " -NoNewline;
    Write-Host $object.GetValue('DisplayVersion')
}

PRODUCCIÓN :

Greenshot 1.2.10.6 - 1.2.10.6
Apache NetBeans IDE 15 - 15
Notepad++ (64-bit x64) - 8.4.4
Microsoft 365 Apps for enterprise - en-us - 16.0.16130.20218
Microsoft OneDrive - 23.038.0219.0001
R for Windows 4.2.1 - 4.2.1
WinRAR 6.11 (64-bit) - 6.11.0
XAMPP - 8.1.6-0
Python 3.10.6 Development Libraries (64-bit) - 3.10.6150.0
Python 3.11.0 pip Bootstrap (64-bit) - 3.11.150.0
Python 3.10.6 Test Suite (64-bit) - 3.10.6150.0
Python 3.10.6 Utility Scripts (64-bit) - 3.10.6150.0
Python 3.11.0 Core Interpreter (64-bit) - 3.11.150.0
Microsoft Visual C++ 2019 X64 Additional Runtime - 14.28.29325 - 14.28.29325
Typora 1.4 - 1.4.3
Python 3.10.6 pip Bootstrap (64-bit) - 3.10.6150.0
Python 3.10.6 Documentation (64-bit) - 3.10.6150.0
Python 3.10.6 Add to Path (64-bit) - 3.10.6150.0
Oracle VM VirtualBox 7.0.6 - 7.0.6
Windows PC Health Check - 3.6.2204.08001
Python 3.11.0 Tcl/Tk Support (64-bit) - 3.11.150.0
Python 3.11.0 Development Libraries (64-bit) - 3.11.150.0
Python 3.10.6 Executables (64-bit) - 3.10.6150.0
Node.js - 18.12.1
Microsoft Visual C++ 2019 X64 Minimum Runtime - 14.28.29325 - 14.28.29325
Update for Windows 10 for x64-based Systems (KB5001716) - 4.91.0.0
Microsoft Update Health Tools - 3.70.0.0
Office 16 Click-to-Run Licensing Component - 16.0.16130.20218
Office 16 Click-to-Run Extensibility Component - 16.0.16130.20218
Python 3.10.6 Tcl/Tk Support (64-bit) - 3.10.6150.0
Python 3.11.0 Add to Path (64-bit) - 3.11.150.0
Python 3.11.0 Executables (64-bit) - 3.11.150.0
ScreenToGif - 2.37.1
Python 3.11.0 Utility Scripts (64-bit) - 3.11.150.0
Python 3.10.6 Standard Library (64-bit) - 3.10.6150.0
Python 3.10.6 Core Interpreter (64-bit) - 3.10.6150.0
Python 3.11.0 Standard Library (64-bit) - 3.11.150.0
Python 3.11.0 Documentation (64-bit) - 3.11.150.0
Python 3.11.0 Test Suite (64-bit) - 3.11.150.0
Java(TM) SE Development Kit 18.0.2.1 (64-bit) - 18.0.2.1

Usamos Get-ChildItem para consultar el registro y obtener todo el software instalado en la máquina local. Almacenamos esta lista en la variable $installedSoftware, que usamos con el bucle ForEach. El bucle se repitió sobre $installedSoftware y utilizamos el cmdlet Write-Host tres veces para cada elemento de la lista.

Primero, se usó Write-Host para imprimir el DisplayName del software actual recuperado usando el método GetValue(). El segundo cmdlet Write-Host se usó para imprimir un separador; utilizamos -; puedes usar cualquiera de tus opciones. En tercer lugar, Write-Host imprimió el DisplayVersion del software actual, que obtuvimos utilizando el método GetValue(). Finalmente, se utilizó -NoNewLine para no insertar un salto de línea.

El código anterior enumera todo el software instalado en nuestra máquina local, pero las aplicaciones también se pueden instalar por usuario. Entonces, para obtener una lista de software para un usuario actualmente conectado, tenemos que cambiar HKLM a HKCU como se muestra a continuación. Entonces, aquí, LM significa Máquina local mientras que CU significa Usuario actual.

Utilice el cmdlet Get-ChildItem:

$installedSoftware = Get-ChildItem "HKCU:\Software\Microsoft\Windows\CurrentVersion\Uninstall"
foreach($object in $installedSoftware){
    Write-Host $object.GetValue('DisplayName') -NoNewline;
    Write-Host " - " -NoNewline;
    Write-Host $object.GetValue('DisplayVersion')
}

PRODUCCIÓN :

Microsoft Teams - 1.5.00.21668
Zoom - 5.13.3 (11494)
Python 3.10.6 (64-bit) - 3.10.6150.0
Telegram Desktop - 4.4
Microsoft Visual Studio Code (User) - 1.74.3
Python 3.11.0 (64-bit) - 3.11.150.0

Para obtener información en forma tabular, podemos utilizar la siguiente solución.

Utilice el cmdlet Get-ItemProperty con Select-Object:

Get-ItemProperty HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\* |
Select-Object DisplayName, DisplayVersion, Publisher, InstallDate |
Format-Table -AutoSize

PRODUCCIÓN :

DisplayName                        DisplayVersion Publisher                  InstallDate
-----------                        -------------- ---------                  -----------
Google Chrome                      111.0.5563.64  Google LLC                 20230310
Microsoft Edge                     110.0.1587.63  Microsoft Corporation      20230304
Microsoft Edge WebView2 Runtime    110.0.1587.63  Microsoft Corporation      20230306
Python Launcher                    3.11.7966.0    Python Software Foundation 20221108
Teams Machine-Wide Installer       1.5.0.8070     Microsoft Corporation      20220916
...                                ...            ...                        ...
...                                ...            ...                        ...

Usamos el cmdlet Get-ItemProperty para recuperar las propiedades DisplayName, DisplayVersion, Publisher, InstallDate de los objetos seleccionados. Por el contrario, se utilizó el cmdlet Format-Table para mostrar los datos recibidos en formato tabular.

Se trata de cómo comprobar si el software está instalado.

Artículos relacionados