我发现这个 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
系统是一款家用电脑
桌面 1
系统是一个桌面
EnterpriseServer 4
系统是企业服务器
最大枚举值 最大8
Mobile 2
System 是一款移动设备
PerformanceServer 7
System 是一款性能服务器
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."}