Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/12.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从JSON获取值_Json_Powershell - Fatal编程技术网

使用Powershell从JSON获取值

使用Powershell从JSON获取值,json,powershell,Json,Powershell,非常初级的问题。我正在尝试使用Powershell从JSON获取某些值。。具体来说,我只想列出服务:TEST00000和FAKE 当我运行下面的脚本时,我得到以下结果: TEST00000 FAKE --------- ---- @{Enabled=T

非常初级的问题。我正在尝试使用Powershell从JSON获取某些值。。具体来说,我只想列出服务:TEST00000FAKE

当我运行下面的脚本时,我得到以下结果:

TEST00000                                                    FAKE           
---------                                                    ----           
@{Enabled=True; Processed=2; Sent=3; Failed=4; Downloaded=5} @{Enabled=True}
我怎样才能得到一份服务清单

更重要的是,如何仅列出其中启用了key/value=True的服务

代码如下:

$JSON = '{
  "Envs": {
    "DEV": {
      "Services": {
        "TEST00000": {
          "Enabled": true,
          "Processed": 2,
          "Sent": 3,
          "Failed": 4,
          "Downloaded": 5
        },
        "FAKE": {
          "Enabled": true
        }
      }
    }
  },
  "Component": {
    "Digger": {
      "Envs": {
        "DEV": {
          "DownloadE": 4
        }
      }
    }
  }
}'

$jsonobj = ConvertFrom-Json -inputObject $JSON

$jsonobj.Envs.DEV.Services

这应该允许您动态获取名称,而不考虑JSON中的服务名称:

$JSON = '{
  "Envs": {
    "DEV": {
      "Services": {
        "TEST00000": {
          "Enabled": true,
          "Processed": 2,
          "Sent": 3,
          "Failed": 4,
          "Downloaded": 5
        },
        "FAKE": {
          "Enabled": true
        }
      }
    }
  },
  "Component": {
    "Digger": {
      "Envs": {
        "DEV": {
          "DownloadE": 4
        }
      }
    }
  }
}'

$jsonobj = ConvertFrom-Json -inputObject $JSON
$enabledServices = $NULL
$disabledServices = $NULL

# Since the service names are arbitrary
# create an object that contains only
# objects whose MemberType is NoteProperty

$strServiceNames = @($($jsonobj.Envs.DEV.Services | Get-Member | Where { $_.MemberType -eq "NoteProperty" } | Select Name).Name)
$pscoServiceNames = [PSCustomObject]@{Names=$strServiceNames}
foreach($serviceName in $pscoserviceNames.Names)
{
    # dynamically access the service name
    # from $jsonobj.Envs.DEV.Services

    $serviceStatus = $jsonobj.Envs.DEV.Services.$serviceName.Enabled

    # parse results based on value of .Enabled

    if($serviceStatus.ToString() -eq "True")
    {
        $enabledServices = [Array]$enabledServices + [PSCustomObject]@{Name = $serviceName;Enabled = $serviceStatus}
    }
    else
    {
        $disabledServices = [Array]$disabledServices + [PSCustomObject]@{Name = $serviceName;Enabled = $serviceStatus}
    }
}

# Show the results

Write-Output "`nEnabled Services`n"
$enabledServices | Format-List
Write-Output "`nDisabled Services`n"
$disabledServices | Format-List
如果有任何不清楚的地方,请告诉我,我可以更详细地解释 希望这对你有所帮助。
炮击快乐

获取每个
服务
属性的名称。您可以像user2734259那样使用
Get Member
,也可以使用
psobject
属性来存储有关对象的有用信息

$ServiceNames = $jsonobj.Envs.DEV.Services.psobject.properties.name
一旦您有了这些名称,您就可以在其上循环并在子属性
上进行过滤

$jsonobj.Envs.DEV.Services.psobject.properties.name | ForEach-Object { 
    $_ | Where-Object {$jsonobj.Envs.DEV.Services.$_.Enabled -eq $True}
}

非常感谢您的回复,这非常有趣!如果($serviceStatus-eq“False”)@toastman,我将在回到编写代码的机器时再次访问,并在必要时进行修复和编辑,以确保完整性。认为这可能是一个类型问题,但会检查。在那之前,祝你假期愉快,这是一个类型错误$serviceStatus是布尔值,因此需要将其转换为字符串以匹配正则表达式。所以只要将这一行更改为:
if($serviceStatus.ToString()-eq“False”)
,它就可以根据需要工作了。最后,我使用了BenH的代码,将BenH response标记为解决方案。但我非常感谢你们的帮助。非常感谢你们的回复,这非常有趣,我花了很多时间试图寻找这些信息,你们是怎么知道的?我在哪里可以进一步阅读这篇文章?(还是在学习使用PS帮助内容的艺术!?)@ToastMan我个人从唐琼斯午餐月书籍开始。知道隐藏的
psobject
属性后,我从某人的答案中找到了它(太长时间不记得是谁了)。嗯,最后一部分似乎不起作用:$| Where Object{$jsonobj.Envs.DEV.Services.$|Enabled-eq'false'}@ToastMan更新了我的答案以解决这个问题。这是因为
Enabled
属性是布尔值。当您尝试将字符串
'false'
转换为布尔值时,它会变成
$True
。您可以使用
[bool]'false'
来测试这一点。