Encontré este script de PS que verifica si la PC es una computadora de escritorio o una computadora portátil
function Get-HardwareType {
$hardwaretype = Get-WmiObject -Class Win32_ComputerSystem -Property PCSystemType
If ($hardwaretype -ne 2)
{
return $true
}
Else
{
return $false
}}
If (Get-HardwareType)
{
"$Env:ComputerName is a Desktop"
}
Else
{
"$Env:ComputerName is a Laptop"
}
Si el resultado es "Laptop", necesito ejecutar este otro comando
Add-AppxPackage -Path ".\28671Petrroll.PowerPlanSwitcher_0.4.4.0_x86__ge82akyxbc7z4.Appx"
o bien saltarlo. ¿Cómo puedo combinarlos?
EDITAR:
Parece que necesito una conexión a Internet para instalar completamente la aplicación; Sin Internet, la aplicación no se inicia mientras la ejecute con una conexión a Internet. ¿Alguien sabe qué debo hacer sin conexión a Internet? ¿O es imposible?
Respuesta1
Aquí hay una versión limpia y más legible de su código:
function Test-IsLaptop {
$HardwareType = (Get-WmiObject -Class Win32_ComputerSystem -Property PCSystemType).PCSystemType
# https://docs.microsoft.com/en-us/windows/win32/cimwin32prov/win32-computersystem
# Mobile = 2
$HardwareType -eq 2
}
if (Test-IsLaptop) {
Write-Host "$Env:ComputerName is a Laptop"
Add-AppxPackage -Path "$PSScriptRoot\28671Petrroll.PowerPlanSwitcher_0.4.4.0_x86__ge82akyxbc7z4.Appx"
} else {
Write-Host "$Env:ComputerName is a Desktop"
}
Editar: se recomienda cambiar de Get-WmiObject
a Get-CimInstance
. El comando se vería así en ese caso:
$HardwareType = (Get-CimInstance -Class Win32_ComputerSystem -Property PCSystemType).PCSystemType
Y aquí está la razón por la cual:
La gran diferencia entre los cmdlets WMI y los cmdlets CIM es que los cmdlets CIM usan WSMAN (WinRM) para conectarse a máquinas remotas. De la misma manera que puede crear sesiones remotas de PowerShell, puede crear y administrar sesiones CIM mediante estos cmdlets.
El gran inconveniente de los cmdlets WMI es que utilizan DCOM para acceder a máquinas remotas. DCOM no es compatible con firewall, puede ser bloqueado por equipos de red y genera algunos errores arcanos cuando algo sale mal.
Fuente:https://devblogs.microsoft.com/scripting/should-i-use-cim-or-wmi-with-windows-powershell/
Respuesta2
Bueno, por ahora eso puede ser cierto. Las cosas cambian y un día ya no es así. Según mi experiencia escribiendo código para configurar diferentes tipos de hardware de PC durante más de 20 años, vale la pena ser lo más minucioso posible. Sólo estoy tratando de ahorrarte penas en el futuro.
Mire todos los diferentes tipos de chasis en esta URL. Todos estos podrían potencialmente ser reportados por una computadora portátil: portátil (8), computadora portátil (9), computadora portátil (10), subcomputadora portátil (14)
https://docs.microsoft.com/en-us/windows/win32/cimwin32prov/win32-systemenclosure
Respuesta3
Su programa no prueba que sea una computadora de escritorio, solo determina si el sistema es una computadora portátil o no. Está asumiendo que un sistema debe ser uno u otro, lo cual es erróneo. Este es el día del Internet de las cosas con dispositivos, servidores, estaciones de trabajo y computadoras de escritorio integrados, además de las computadoras portátiles. Nunca asumas.
Aquí están los valores posibles:
AppliancePC 6
System es un dispositivo PC
Desktop 1
El sistema es un escritorio
El sistema EnterpriseServer 4
es un servidor empresarial
Máximo 8
Valor máximo de enumeración
Mobile 2
System es un dispositivo móvil
PerformanceServer 7
System es un servidor de rendimiento
El sistema SOHOServer 5
es un servidor para pequeñas oficinas y oficinas domésticas (SOHO)
No especificado 0
El tipo de sistema no está especificado
Workstation 3
System es una estación de trabajo
Prueba esto:
Function IsLaptop
{
$isLaptop = $false
if(Get-WmiObject -Class win32_systemenclosure |
Where-Object { $_.chassistypes -eq 8 -or $_.chassistypes -eq 9 -or $_.chassistypes -eq 10 -or $_.chassistypes -eq 14 -or $_.chassistypes -eq 30})
{ $isLaptop = $true }
Return $isLaptop
}
If (IsLaptop) {"This is a laptop"} Else {"This is not a laptop."}