Powershell: как я могу использовать массив или хеш-таблицу в качестве встроенного поиска

Используя 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
Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
3
0
323
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'}]}}

... с этой строкой ...

@{n='Thermal State'; e = {@{'3'='Safe'}["$($_.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()]}}

Согласно 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 :

> $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

Другие вопросы по теме