Arrays Powershell:如何使用数组或哈希表作为内联查找

Arrays Powershell:如何使用数组或哈希表作为内联查找,arrays,powershell,hashtable,Arrays,Powershell,Hashtable,我正在使用Powershell调用win32\u computersystem。我想列出有关机器的数据,包括$\u thermalstate-这是我的代码 代码看起来应该可以工作,但返回一个空值。我想创建一个内联数组或哈希表,该值$\u0.thermalstate引用该数组或哈希表 Get-WmiObject win32_computersystem | select Name, Model, Caption, @{n="Timezone"; e={$_.currenttimezone}}, D

我正在使用Powershell调用win32\u computersystem。我想列出有关机器的数据,包括
$\u thermalstate
-这是我的代码

代码看起来应该可以工作,但返回一个空值。我想创建一个内联数组或哈希表,该值
$\u0.thermalstate
引用该数组或哈希表

Get-WmiObject win32_computersystem | select Name, Model, Caption, @{n="Timezone"; e={$_.currenttimezone}}, Description, DNShostname,Domain,@{n='Domain Role'; E={$_.domainrole}},Roles,Status,@{n='System Type'; e={$_.systemtype}},@{n='Thermal State'; e={$_.thermalstate[@{'3'='safe'}]}}
输出

Name          : MYPC
Model         : Latitude E5470
Caption       : MYPC
Timezone      : 600
Description   : AT/AT COMPATIBLE
DNShostname   : MYPC
Domain        : work.biz
Domain Role   : 1
Roles         : {LM_Workstation, LM_Server, NT}
Status        : OK
System Type   : x64-based PC
Thermal State : Safe

您的查找结构是。。。错。[咧嘴笑]

替换此重新格式化版本代码的最后一行

Get-WmiObject win32_computersystem |
    Select-Object Name, Model, Caption,
        @{n="Timezone"; e={$_.currenttimezone}},
        Description, DNShostname,Domain,
        @{n='Domain Role'; E={$_.domainrole}},
        Roles,Status,
        @{n='System Type'; e={$_.systemtype}},
        @{n='Thermal State'; e={$_.thermalstate[@{'3'='safe'}]}}
。。。用这句话

@{n='Thermal State'; e={@{'3'='Safe'}["$($_.ThermalState)"]}}
请注意,查找表位于
[]
的外部,并且该值被强制为字符串



不过,我不会这样做。太挑剔了。在调用之前创建查找表,并使用该表执行查找

您的代码看起来像是在试图声明/初始化哈希表,同时还试图将thermalstate用作哈希数组。 如果首先初始化哈希数组,代码如下所示:

$h = @{'3'='safe'}; Get-WmiObject win32_computersystem | select Name, Model, Caption, @{n="Timezone"; e={$_.currenttimezone}}, Description, DNShostname,Domain,@{n='Domain Role';E={$_.domainrole}},Roles,Status,@{n='System Type'; e={$_.systemtype}},@{n='Thermal State'; e={$h[$_.thermalstate.toString()]}}

您可以创建一个枚举

enum ThermalState {
Other          = 1
Unknown        = 2
Safe           = 3
Warning        = 4
Critical       = 5
NonRecoverable = 6
}
并使用它从属性获取详细响应

Get-WmiObject win32_computersystem | Select-Object Name, Model, Caption, 
    @{n="Timezone"; e={$_.currenttimezone}}, Description, DNShostname,Domain,
    @{n='Domain Role';E={$_.domainrole}},Roles,Status,
    @{n='System Type'; e={$_.systemtype}},
    @{n='Thermal State'; e={[ThermalState]$_.thermalstate}}
样本输出

Name          : HP-G1610
Model         : ProLiant MicroServer Gen8
Caption       : HP-G1610
Timezone      : 120
Description   : AT/AT COMPATIBLE
DNShostname   : HP-G1610
Domain        : DOMAIN
Domain Role   : 0
Roles         : {...}
Status        : OK
System Type   : x64-based PC
Thermal State : Safe
通常,要获取枚举列表,请执行以下操作:

> $Enum ='System.DayOfWeek'
> [Enum]::GetValues($Enum) | ForEach-Object {'{0} {1}' -f [int]$_,$_ }
0 Sunday
1 Monday
2 Tuesday
3 Wednesday
4 Thursday
5 Friday
6 Saturday
> $Enum ='System.DayOfWeek'
> [Enum]::GetValues($Enum) | ForEach-Object {'{0} {1}' -f [int]$_,$_ }
0 Sunday
1 Monday
2 Tuesday
3 Wednesday
4 Thursday
5 Friday
6 Saturday