Запустить скрипт, если ПК — ноутбук

Запустить скрипт, если ПК — ноутбук

Я нашел этот скрипт PS, который проверяет, является ли ПК настольным компьютером или ноутбуком.

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

Если результат — «Ноутбук», мне нужно выполнить эту другую команду

Add-AppxPackage -Path ".\28671Petrroll.PowerPlanSwitcher_0.4.4.0_x86__ge82akyxbc7z4.Appx"

или пропустить. Как их объединить?

РЕДАКТИРОВАТЬ:

Кажется, мне нужно подключение к интернету для полной установки приложения; без интернета приложение не запускается, пока я запускаю приложение с подключением к интернету. Кто-нибудь знает, что мне нужно сделать без подключения к интернету? Или это невозможно?

решение1

Вот более читаемая версия вашего кода:

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

Редактировать: Рекомендуется переключиться с Get-WmiObjectна Get-CimInstance. В этом случае команда будет выглядеть так:

$HardwareType = (Get-CimInstance -Class Win32_ComputerSystem -Property PCSystemType).PCSystemType

И вот почему:

Большая разница между командлетами WMI и командлетами CIM заключается в том, что командлеты CIM используют WSMAN (WinRM) для подключения к удаленным машинам. Точно так же, как вы можете создавать сеансы удаленного взаимодействия PowerShell, вы можете создавать и управлять сеансами CIM с помощью этих командлетов.

Большим недостатком командлетов WMI является то, что они используют DCOM для доступа к удаленным машинам. DCOM не дружит с брандмауэрами, может блокироваться сетевым оборудованием и выдает некоторые загадочные ошибки, когда что-то идет не так.

Источник:https://devblogs.microsoft.com/scripting/should-i-use-cim-or-wmi-with-windows-powershell/

решение2

Ну, пока это может быть правдой. Все меняется, и однажды это уже не так. По моему опыту написания кода для настройки различных типов оборудования ПК за более чем 20 лет, стоит быть настолько тщательным, насколько это возможно. Я просто пытаюсь уберечь вас от неприятностей в будущем.

Посмотрите на все различные типы шасси по этому URL. Все они потенциально могут быть сообщены ноутбуком: Portable (8), Laptop (9), Notebook (10), Sub Notebook (14)

https://docs.microsoft.com/en-us/windows/win32/cimwin32prov/win32-systemenclosure

решение3

Ваша программа не доказывает, что это настольный компьютер, она просто определяет, является ли система ноутбуком. Вы делаете предположение, что система должна быть одним из них, что ошибочно. Это время Интернета вещей со встроенными устройствами, серверами, рабочими станциями и настольными компьютерами в дополнение к ноутбукам. Никогда не предполагайте.

Вот возможные значения:

AppliancePC 6
System — это компьютер-прибор

Desktop 1
System — это настольный компьютер

Система EnterpriseServer 4
— это корпоративный сервер

Максимум 8
Максимальное значение перечисления

Mobile 2
System — это мобильное устройство

PerformanceServer 7
System — это сервер производительности

Система SOHOServer 5
— сервер для малого и домашнего офиса (SOHO)

Не указано 0
Тип системы не указан

Система Workstation 3
— это рабочая станция

Попробуй это:

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

Связанный контент