Я пытаюсь передать хеш-таблицу вычисленных свойств в запрос для использования с Select-Object
. Работает при запуске в консоли. Я могу подтвердить, что задание считывает хеш-таблицу, поскольку в ней перечислены выбранные свойства в результате, но все их значения равны нулю.
Примечание: Я понимаю, что мне не нужно Тип приведите эти свойства. Я просто демонстрирую свою проблему.
Если я запускаю следующий код (это выглядит странно, но на самом деле есть вариант использования для этого), вывод содержит мои выбранные свойства (из $globalConfig.SystemState.Processors.SelectProperties
), но вычисленные свойства имеют значение null
, единственное свойство, которое возвращает правильное значение: name
:
$globalConfig = @{
PingAddress = '8.8.8.8';
SystemState = @{
Processors = @{
Namespace = 'root\cimv2';
ClassName = 'Win32_Processor';
SelectProperties = 'name', @{ n = 'CpuStatus'; e = { [int]$_.CpuStatus }}, @{ n = 'CurrentVoltage'; e = { [int]$_.CurrentVoltage }};
}
}
}
$job = Start-Job -Name Processors -ArgumentList $globalConfig.SystemState.Processors -ScriptBlock {
Try{
$Response = @{
State = @();
Error = $Null
}
$Response.State = Get-CimInstance -ClassName $Args[0].ClassName | Select-Object $Args[0].SelectProperties -ErrorAction Stop
}Catch{
$Response.Error = @{Id = 2; Message = "$($Args[0].Target) query failed: $($_.Exception.Message)"}
}
Return $Response
}
$job | Wait-Job
$job | Receive-Job | ConvertTo-Json -Depth 3
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
119 Processors BackgroundJob Completed True localhost ...
{
"Error": null,
"State": {
"name": "Intel(R) Core(TM) i7-4710MQ CPU @ 2.50GHz",
"CpuStatus": null,
"CurrentVoltage": null
}
}
Тем не менее, если я запускаю то же самое задание, но с теми же вычисленными свойствами, жестко запрограммированными (не переданными в Select-Object с помощью PSObject), оно работает как положено (значения 1
и 12
возвращаются в выводе):
$job = Start-Job -Name Processors -ArgumentList $globalConfig.SystemState.Processors -ScriptBlock {
Try{
$Response = @{
State = @();
Error = $Null
}
$Response.State = Get-CimInstance -ClassName $Args[0].ClassName | Select-Object Name, @{ n = 'CpuStatus'; e = { [int]$_.CpuStatus }},@{ n = 'CurrentVoltage'; e = { [int]$_.CurrentVoltage }}
}Catch{
$Response.Error = @{Id = 2; Message = "$($Args[0].Target) query failed: $($_.Exception.Message)"}
}
Return $Response
}
$job | Wait-Job
$job | Receive-Job | ConvertTo-Json -Depth 3
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
121 Processors BackgroundJob Completed True localhost ...
{
"Error": null,
"State": {
"Name": "Intel(R) Core(TM) i7-4710MQ CPU @ 2.50GHz",
"CpuStatus": 1,
"CurrentVoltage": 12
}
}
Как передать объект с вычисленными свойствами в строку Select-Object
, находясь внутри задания ?