如果 PC 是筆記型電腦,則執行腳本

如果 PC 是筆記型電腦,則執行腳本

我發現這個 PS 腳本可以檢查 PC 是桌上型電腦還是筆記型電腦

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-WmiObjectGet-CimInstance.在這種情況下,命令將如下所示:

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

原因如下:

WMI cmdlet 和 CIM cmdlet 之間的最大差異在於 CIM cmdlet 使用 WSMAN (WinRM) 連接到遠端電腦。與建立 PowerShell 遠端處理會話的方式相同,您可以使用這些 cmdlet 建立和管理 CIM 會話。

WMI cmdlet 的一大缺點是它們使用 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

Desktop 1
系統是桌面

EnterpriseServer 4
系統是企業伺服器

最大 8
最大枚舉值

Mobile 2
系統是一個行動設備

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

相關內容