我發現這個 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-WmiObject
到Get-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."}