PCがラップトップの場合にスクリプトを実行する

PCがラップトップの場合にスクリプトを実行する

PCがデスクトップかラップトップかをチェックする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 年以上にわたってさまざまな種類の PC ハードウェアを構成するコードを書いてきた私の経験では、できる限り徹底した方が得策です。私はただ、将来あなたが苦労しないようにしたいだけです。

この URL で、さまざまなシャーシ タイプをすべて確認してください。これらはすべて、ラップトップによって報告される可能性があります: ポータブル (8)、ラップトップ (9)、ノートブック (10)、サブノートブック (14)

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

答え3

あなたのプログラムは、それがデスクトップであることを証明しているわけではなく、システムがラップトップであるかどうかを判定しているだけです。システムはどちらか一方であるはずだという仮定を立てていますが、これは誤りです。今は、ラップトップに加えて、組み込みデバイス、サーバー、ワークステーション、デスクトップを備えたモノのインターネットの時代です。決して仮定しないでください。

可能な値は次のとおりです。

AppliancePC 6
システムはアプライアンスPCです

デスクトップ1
システムはデスクトップです

EnterpriseServer 4
システムはエンタープライズサーバーです

最大 8
最大列挙値

Mobile 2
Systemはモバイルデバイスです

PerformanceServer 7
システムはパフォーマンスサーバーです

SOHOServer 5
システムは、小規模オフィスおよびホームオフィス(SOHO)サーバーです。

未指定 0
システムタイプが指定されていません

ワークステーション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."}

関連情報