Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell Get Service命令是否输出服务代码而不是文本状态?_Powershell - Fatal编程技术网

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
    开关选择使用符号名(作为字符串)

因此,在Windows PowerShell中,在调用
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
请注意如何使用单个管道就足够了