Свойство .Status
из [System.ServiceProcess.ServiceController]
указывает, что выходные данные командлета Get-Service
имеют тип [System.ServiceProcess.ServiceControllerStatus]
, который является перечислением тип (производным от [System.Enum]
): то есть он связывает символические имена с числовыми значениями;например, символическое имя Stopped
связано с номером 1
.
ConvertTo-Json
сериализует такие значения перечисления как числа :
неизменно в Windows PowerShell.
по умолчанию в PowerShell Core ;вместо этого вы можете использовать символические имена (например, строки ), используя переключатель -EnumsAsStrings
.
В Windows PowerShell вам необходимо явно преобразуйте символьные имена в строки перед , вызывая ConvertTo-Json
, чего можно достичь с помощью вычисляемого свойства ;Вот упрощенный пример:
Get-Service |
Select-Object Name,
DisplayName,
@{ n='Status'; e={ $_.Status.ToString() } },
@{ n='table'; e={ 'Status' } } |
ConvertTo-Json
Выше приведено что-то вроде следующего;обратите внимание, что свойство "Status"
теперь содержит строки, представляющие символические имена типа перечисления:
{
"Name": "AppIDSvc",
"DisplayName": "Application Identity",
"Status": "Stopped",
"table": "Status"
},
{
"Name": "Appinfo",
"DisplayName": "Application Information",
"Status": "Running",
"table": "Status"
}
...
Применимо к вашему сценарию:
[pscustomobject] @{
metrics = @(
Get-Service |
select Name,
DisplayName,
@{ n='Status'; e={ $_.Status.ToString() } },
@{ n='table'; e={ 'Status' } }
)
} | ConvertTo-Json
Обратите внимание, как использоватьдостаточно одного трубопровода.