Powershell:如何将数组或哈希表用作内联查找?

3

使用PowerShell我正在调用win32_computersystem。 我想列出有关计算机的数据,包括$_thermalstate - 这是我的代码:

Get-WmiObject -Class Win32_ComputerSystem | Select-Object Model, Manufacturer, @{Name='ThermalState'; Expression={$_.ThermalState}}

代码看起来应该可以工作,但返回一个空值。 我想创建一个内联数组或哈希表,使值$_.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
3个回答

3

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

在您的代码重新格式化版本中,替换最后一行...

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'}]}}

使用此行与服务器建立SSH连接:

@{n='Thermal State'; e={@{'3'='Safe'}["$($_.ThermalState)"]}}

请注意,查找表在方括号[]的外部,并且要将该值强制转换为字符串。
然而,我不会以这种方式做。这太过麻烦了。在调用之前创建查找表,并使用它来执行查找。

1
根据https://wutils.com/wmi/root/cimv2/win32_computersystem/
ThermalState property
CIMTYPE         'uint16'
Description     'The ThermalState property identifies the enclosure's thermal state when last booted.'
MappingStrings  ['SMBIOS|Type 3|System Enclosure or Chassis|Thermal State']
read            True
ValueMap        ['1', '2', '3', '4', '5', '6']
Values          ['Other', 'Unknown', 'Safe', 'Warning', 'Critical', 'Non-recoverable']
ThermalState property is in 1 class (Win32_ComputerSystem) of ROOT\cimv2 and in 2 namespaces

你可以创建一个枚举。
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

1
你的代码看起来像是想要声明/初始化一个哈希表,同时也尝试将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()]}}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接