如何在powershell

时间:2018-03-06 16:55:44

标签: powershell iteration invoke-command

设法通过

获取JSON数据
$R= Invoke-WebRequest -Uri $url -Headers $headers -ContentType "application/json"   -Method Get -UseBasicParsing
$x = $R.Content | Out-String | ConvertFrom-Json 

现在我有一个像这样的JSON文件:

{
  "id": 1000,
  "name_with_namespace": "myProjectName1",

},
{
  "id": 1001,
  "name_with_namespace": "myProjectName2",

},
{
  "id": 1002,
  "name_with_namespace": "myProjectName3",

}

现在我需要提取"name_with_namespace""id" "name_with_namespace" = "myProjectName.*"

所有出现的情况

我怎样才能一次性完成?

我试过这个:

foreach ($name in $x.name_with_namespace) {
    if ( $name -match ".*myProjectName.*" ) {    
        write-host "$name - $x.id"               
    }   
}

但我得到了这个:

myProjectName1 1000 1001 1002
myProjectName2 1000 1001 1002
myProjectName3 1000 1001 1002

我知道问题出在$ x.id上,我怎样才能获得正确的价值而不是一切?

我的预期输出是

myProjectName1 1000
myProjectName2 1001
myProjectName3 1002

3 个答案:

答案 0 :(得分:6)

在定义循环时,您正在向下钻取太多水平。只需迭代$x,然后检查循环内的特定属性。

foreach ($name in $x) {
    if ( $name.name_with_namespace -match ".*myProjectName.*" ) {    
        write-host "$($name.name_with_namespace) - $($name.id)"               
    }   
}

修改:在旁注中,您可以将-match简化为"myProjectName",它也可以正常运行,也可能更快。

答案 1 :(得分:1)

所以基本上你已经获得了带有父节点的json,所以我没有覆盖那部分。假设您已经拥有父节点,那么您可以直接执行此操作:

$a=@"
{"ParentNode":[
    {"id":1000,"name_with_namespace":"myProjectName"},
    {"id":1001,"name_with_namespace":"myProjectName2"},
    {"id":1002,"name_with_namespace":"myProjectName3"}
]}
"@ 

($a | ConvertFrom-Json).ParentNode

<强>输出:

id name_with_namespace
  -- -------------------
1000 myProjectName      
1001 myProjectName2     
1002 myProjectName3

您可以随意解析。那部分没有问题。确保您的json是从restAPI接收的结构。 使用点方法,您可以转到任何级别,也可以使用select-object直接选择它们。

希望它有所帮助。

答案 2 :(得分:0)

ConvertFrom-Json有一些odd behavior with pipelines。问题是ConvertFrom-Json将JSON数组包装在一个数组中,然后将整个数组作为一个项传递给管道。在大多数情况下这很好,但如果最外层是JSON数组,则整个数组作为单个对象传递到管道中。

比较:

PS> ConvertFrom-Json '[1, 2, 3]' | ForEach-Object  {": $_"}
: 1 2 3

PS> (ConvertFrom-Json '[1, 2, 3]') | ForEach-Object  {": $_"}
: 1
: 2
: 3

PS> $x = ConvertFrom-Json '[1, 2, 3]'
PS> $x | ForEach-Object  {": $_"}
: 1
: 2
: 3
PS> ,$x | ForEach-Object  {": $_"}
: 1 2 3

请注意,最后一个示例我们可以使用一元逗号运算符复制问题。

PowerShell Core 6已报告此问题here

试试这段代码:

$j = @'
[
    {
        "id": 1000,
        "name_with_namespace": "myProjectName1"
    },
    {
        "id": 1001,
        "name_with_namespace": "myProjectName2"
    },
    {
        "id": 1002,
        "name_with_namespace": "myProjectName3"
    }
]
'@

($j | Out-String | ConvertFrom-Json) |
Where-Object name_with_namespace -match ".*myProjectName.*" |
ForEach-Object {
    "$($_.name_with_namespace) $($_.id)"
}