我目前正在使用Powershell脚本,该脚本应该检索我正在使用的计算机的类型,并且我已经查看了几个示例,但是我无法使其正常工作。我想检索机箱类型,以便确定是在笔记本电脑还是台式机上工作。
这是我的代码:
$isLaptop = [bool](Get-WmiObject -Class Win32_SystemEnclosure -Property
ChassisTypes | Where-Object ChassisTypes -in '{9}', '{10}', '{14}')
问题在于,即使我在台式机上运行脚本,尽管台式机的机箱类型为{3},我仍会得到正确的响应。
我可能忽略了一些愚蠢的事情,但是如果有人可以在这里给我一些帮助,那将是很好的,我也是powershell的新手。
答案 0 :(得分:2)
这是Mark可读性的替代选择:
#requires -Version 3
$isLaptop = [bool](Get-WmiObject -Class Win32_SystemEnclosure |
Where-Object ChassisTypes -in '{9}', '{10}', '{14}')
但是,在尝试重现您的问题之后,您没有使用正确的类型。该命令的输出如下所示:
ChassisTypes : {3}
您实际拥有的是一个UInt16
数组。因此,您需要比较的是一个集合到另一个集合:
[uint16[]]$laptop = 9, 10, 14
$isLaptop = foreach ($chassis in (Get-CimInstance -ClassName Win32_SystemEnclosure).ChassisTypes) {
if ($chassis -in $laptop) {
$true
break
}
}
然后进一步细分:
#requires -Version 4
$isLaptop = [bool](Get-CimInstance -ClassName Win32_SystemEnclosure).
ChassisTypes.
Where({ $PSItem -in 9, 10, 14 })
答案 1 :(得分:0)
尝试一下:
$ChassisType = (Get-CimInstance -ClassName Win32_SystemEnclosure).ChassisTypes
if ($ChassisType -eq 9 -or $ChassisType -eq 10 -or $ChassisType -eq 14) {
$isLaptop = $true
}
else {
$isLaptop = $false
}
$isLaptop
答案 2 :(得分:0)
这段代码是 taken from here 并做成了一个函数。它创建一个哈希表并将值转换为人类可读的形式。
我已经在 5.1 和 7.1 中对此进行了测试,并且适用于这两个版本。所以它是未来一段时间的证明。
Function Get-ChassisType() {
$ChassisTypes = @{
Name = 'ChassisType'
Expression = {
# property is an array, so process all values
$result = foreach($value in $_.ChassisTypes)
{
switch([int]$value)
{
1 {'Other'}
2 {'Unknown'}
3 {'Desktop'}
4 {'Low Profile Desktop'}
5 {'Pizza Box'}
6 {'Mini Tower'}
7 {'Tower'}
8 {'Portable'}
9 {'Laptop'}
10 {'Notebook'}
11 {'Hand Held'}
12 {'Docking Station'}
13 {'All in One'}
14 {'Sub Notebook'}
15 {'Space-Saving'}
16 {'Lunch Box'}
17 {'Main System Chassis'}
18 {'Expansion Chassis'}
19 {'SubChassis'}
20 {'Bus Expansion Chassis'}
21 {'Peripheral Chassis'}
22 {'Storage Chassis'}
23 {'Rack Mount Chassis'}
24 {'Sealed-Case PC'}
default {"$value"}
}
}
$result
}
}
return (Get-CimInstance -ClassName Win32_SystemEnclosure | Select-Object -Property $ChassisTypes).ChassisType
}
Get-ChassisType
# When using a desktop.
# >PS ((Get-ChassisType) -eq "Desktop")
# >PS True
# When using a desktop.
# >PS Get-ChassisType
# >PS Desktop
# When using a laptop.
# >PS Get-ChassisType
# >PS Laptop