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, VersionPRODUCCIÓ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-Packageen máquinas remotas ejecutándolo como parte del cmdletInvoke-CommandoEnter-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 -AllVersionsPRODUCCIÓ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 msiYa 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.0PRODUCCIÓ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 msiSi 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-PackagePRODUCCIÓ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 SourcePRODUCCIÓ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 $softwarePRODUCCIÓ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_ProductPRODUCCIÓ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-ChildItempara consultar el registro y recuperar una lista de todos los paquetes (software) instalados. - Utilice el bucle
ForEachpara iterar sobre la lista de paquetes instalados. En cada iteración:
- Utilice
Write-Hosttres veces para mostrar elDisplayNamedel software, un separador y elDisplayVersion.
- Utilice
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.1Usamos 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 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.0Para 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 -AutoSizePRODUCCIÓ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.
