Powershell Get Service命令是否输出服务代码而不是文本状态?
我有一个非常简单的代码,它迭代Powershell Get Service命令是否输出服务代码而不是文本状态?,powershell,Powershell,我有一个非常简单的代码,它迭代Get Service |选择Name、DisplayName、Status的输出,然后将其格式化为json对象。我面临的问题是,在我的powershell脚本之外运行该命令会返回实际的文本状态(正在运行、已停止等),但在脚本中,状态为数字(1-4)。我目前正在运行PS版本5.1.18362.145 脚本: $services = Get-Service | Select Name, DisplayName, Status $services.ForEach({
Get Service |选择Name、DisplayName、Status
的输出,然后将其格式化为json对象。我面临的问题是,在我的powershell脚本之外运行该命令会返回实际的文本状态(正在运行、已停止等),但在脚本中,状态为数字(1-4)。我目前正在运行PS版本5.1.18362.145
脚本:
$services = Get-Service | Select Name, DisplayName, Status
$services.ForEach({
Add-Member -NotePropertyName 'table' -NotePropertyValue 'Status' -InputObject $_;
})
$payload = @{
metrics = @($services)
} | ConvertTo-Json
Write-Output ($payload)
示例输出:
{
"Name": "WPDBusEnum",
"DisplayName": "Portable Device Enumerator Service",
"Status": 1,
"table": "Status"
},
{
"Name": "WpnService",
"DisplayName": "Windows Push Notifications System Service",
"Status": 4,
"table": "Status"
},
{
"Name": "WpnUserService_8be1a",
"DisplayName": "Windows Push Notifications User Service_8be1a",
"Status": 4,
"table": "Status"
}
我希望
状态
保持文本而不是数字。这是PS 5特有的吗?您可以这样做:
$services = New-Object System.Collections.ArrayList
foreach ($service in (Get-Service)){
$services.Add(@{"Name"= $service.Name; "DisplayName" = $service.DisplayName; "Status" = $service.Status.ToString()}) | Out-Null
}
$payload = @{
metrics = @($services)
} | ConvertTo-Json
Write-Output ($payload)
cmdlet输出的实例的
.Status
属性的类型为枚举类型(派生自):即,它将符号名与数值相关联;e、 例如,符号名Stopped
与编号1
关联
将此类枚举值序列化为数字:
- 总是在Windows PowerShell中
- 默认情况下,在PowerShell核心中;您可以通过使用
开关选择使用符号名(作为字符串)-EnumsAsStrings
ConvertTo Json
之前,您必须显式地将符号名转换为字符串,这可以通过;下面是一个简化的示例:
获取服务|
选择对象名称,
显示名称,
@{n='Status';e={$\u.Status.ToString()},
@{n='table';e='Status'}}}
转换为Json
上述结果如下所示:;请注意,“Status”
属性现在包含表示枚举类型的符号名的字符串:
{
"Name": "AppIDSvc",
"DisplayName": "Application Identity",
"Status": "Stopped",
"table": "Status"
},
{
"Name": "Appinfo",
"DisplayName": "Application Information",
"Status": "Running",
"table": "Status"
}
...
适用于您的场景:
[pscustomobject]@{
指标=@(
获得服务|
选择名称,
显示名称,
@{n='Status';e={$\u.Status.ToString()},
@{n='table';e='Status'}
)
}|转换为Json
请注意如何使用单个管道就足够了