【问题标题】:Powershell: How can I use an array or hashtable as an inline lookupPowershell:如何使用数组或哈希表作为内联查找
【发布时间】:2023-03-14 01:35:01
【问题描述】:

我使用 Powershell 打电话给win32_computersystem。我想列出有关机器的数据,包括$_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

【问题讨论】:

    标签: arrays powershell hashtable


    【解决方案1】:

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

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

    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)"]}}
    

    请注意,查找表位于[] 的外部,并且该值被强制为字符串。


    但是,我不会这样做。它太挑剔了。在您调用之前创建查找表并使用它来执行查找。

    【讨论】:

      【解决方案2】:

      您的代码看起来像是在尝试声明/初始化哈希表,同时还尝试将热状态用作哈希数组。 如果先初始化哈希数组,代码如下:

      $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()]}}
      

      【讨论】:

        【解决方案3】:

        根据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
        

        【讨论】:

          猜你喜欢
          • 2016-06-01
          • 2018-10-01
          • 2018-10-23
          • 1970-01-01
          • 2014-12-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多