Powershell 迭代 System.Object

Powershell iterate System.Object

我在 PowerShell 脚本中使用 OpenShift CLI,

我有一个带数据的变量 $ProjectList。不确定它的数据类型,但是做 $ProjectsList.GetType() 给我下面的

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Object[]                                 System.Array

正在寻找获取状态为 运行

的名称字段的方法
NAME                                             READY   STATUS             AGE
Service One                                     0/1     Completed            13d
Service Two                                     0/1     Running              13d
Service 3                                       0/1     Running              13d
Service 4                                       0/1     Completed            13d

$ProjectList.Length给我值5.

我正在寻找一种方法来获取名称的整体状态 运行。尝试了以下代码,但它不起作用。

$ProjectsList = c:\TEMP\oc.exe get pods
$FilteredList = $ProjectList.Where{ $_.STATUS -eq 'Running' }

write-host $FilteredList //This shows empty

你能帮我写一些伪代码吗?

您的查询不起作用,因为 CLI 默认输出 table 格式。因此,您的 $ProjectList 仅包含作为字符串数组的格式化文本输出,PowerShell 无法理解。

根据 docs, the CLI is able to output JSON format, by passing argument -o json. This can easily be parsed into actual objects by using PowerShell's ConvertFrom-Json cmdlet:

$ProjectsList = c:\TEMP\oc.exe get pods -o json | Out-String | ConvertFrom-Json

$FilteredList = $ProjectList.Where{ $_.STATUS -eq 'Running' }

Out-String 调用是因为 ConvertFrom-Json 在给定单个输入字符串时效果最好(最可预测的是 1)。重定向本机进程的输出时,您通常会将每一行 one-by-one 作为单独的字符串获取。使用 Out-String 确保管道中的下一个命令将输出接收为单个多行字符串。

1) 将多个字符串传递给 ConvertFrom-Json.

时,请参阅 了解陷阱