Ejecute un script si la PC es una computadora portátil

Ejecute un script si la PC es una computadora portátil

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

información relacionada