Используя 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
ваша структура поиска была... неправильной. [ухмылка]
замените последнюю строку этой переформатированной версии вашего кода...
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