Как получить значения из json с помощью powershell - PullRequest
0 голосов
/ 26 апреля 2020

Ребята, это мой json файл, и я хочу создать скрипт powershell, который даст мне результат, как если бы я использовал метод, такой как Get-Content и другие, но есть некоторые проблемы с синтаксическим анализом json. мое требование я подробно объяснил ниже

MyLocalMachineHome
LocalMachine = Sahil_LocalMachine
Second_MyLocalMachine = Sahil_MylocalMachine
Second_MyLocalMachine = ""

Staging
Second_Staging = Sahil;_Secconf
Staging = Sahil_Staging
third_staging = stsajiii

and there is also one functionality  which i would like to have  if i want to get only variables of "staging"

 I was using this function "Get-Content -Raw -Path 'E:\shell\Powershell\1ReleasePipelines.json'|ConvertFrom-Json  |select -ExpandProperty   variables " on my origanal json file but some how there is some kind of limit 
 in storing string  which i was getting from this method 



{
  "environments": [
    {
      "id": 3,
      "name": "MyLocalMachineHome",
      "variableGroups": [],
      "variables": {
        "LocalMachine": {
          "value": "Sahil_LocalMachine"
        },
        "Second_MyLocalMachine": {
          "value": "Sahil_MylocalMachine"
        },
        "thirf_mylocal": {
          "value": ""
        }
      }
    },
    {
      "id": 7,
      "name": "Staging",
      "variableGroups": [],
      "variables": {
        "Second_Staging": {
          "value": "Sahil;_Secconf"
        },
        "Staging": {
          "value": "Sahil_Staging"
        },
        "third_staging": {
          "value": "stsajiii"
        }
      }
    }
  ]
  }

Ответы [ 3 ]

0 голосов
/ 26 апреля 2020

Просмотр всех под-свойств переменных с помощью format-list вместо format-table. Поскольку свойства различаются, формат-таблица не будет отображать все из них. В json.

$a = get-content file.json


$a.environments.variables | format-table

LocalMachine                Second_MyLocalMachine         thirf_mylocal
------------                ---------------------         -------------
@{value=Sahil_LocalMachine} @{value=Sahil_MylocalMachine} @{value=}


$a.environments.variables | format-list

LocalMachine          : @{value=Sahil_LocalMachine}
Second_MyLocalMachine : @{value=Sahil_MylocalMachine}
thirf_mylocal         : @{value=}

Second_Staging : @{value=Sahil;_Secconf}
Staging        : @{value=Sahil_Staging}
third_staging  : @{value=stsajiii}

есть много неаккуратных конструкций. Получить переменные размещения?

$a.environments | where name -eq staging | foreach variables

Second_Staging          Staging                third_staging
--------------          -------                -------------
@{value=Sahil;_Secconf} @{value=Sahil_Staging} @{value=stsajiii}
0 голосов
/ 27 апреля 2020
cls

start-transcript -path 'C:\E\Devops\PowerShell_Chapters\ABC.txt'

write-output "**********Variables of Release************"

get-content -raw -path 'C:\E\Devops\PowerShell_Chapters\Release.json'| Convertfrom-Json | Select -ExpandProperty variables 

$json = get-content -raw -path 'C:\E\Devops\PowerShell_Chapters\Release.json'| Convertfrom-Json | Select -ExpandProperty environments

$EnvirnomentsVariables = get-content -raw -path 'C:\E\Devops\PowerShell_Chapters\Release.json'| Convertfrom-Json | Select -ExpandProperty environments |Select -ExpandProperty name 

$ReleaseVariable = get-content -raw -path 'C:\E\Devops\PowerShell_Chapters\Release.json'| Convertfrom-Json | Select -ExpandProperty environments |Select -ExpandProperty variables 

$i = 0 

foreach($a in $EnvirnomentsVariables)
{

    $ABC_Staging = $EnvirnomentsVariables[$i]
     #write-output $ABC_Staging
    if( $ABC_Staging -match "ABC Staging")
    {
        write-output "****************Variables of " $EnvirnomentsVariables[$i]*************"
        #add-content 'C:\E\Devops\PowerShell_Chapters\ABC.txt' $EnvirnomentsVariables[$i] 
        # Set-content  -path 'C:\E\Devops\PowerShell_Chapters\Sahil.json'| ConvertTo-Json  | select $EnvirnomentsVariables[$i] 
        write-output $ReleaseVariable[$i]
        #   add-content 'C:\E\Devops\PowerShell_Chapters\ABC.txt' $ReleaseVariable[$i] 
        # Set-content  -path 'C:\E\Devops\PowerShell_Chapters\Sahil.json'| ConvertTo-Json | select  $ReleaseVariable[$i]
    }
    $i = $i + 1   
}
stop-transcript 
0 голосов
/ 26 апреля 2020

Если мы предположим, что $json содержит ваш JSON контент, вы можете сделать следующий уродливый код:

$environment = 'staging'
$j = $json | ConvertFrom-Json
($j.environments | where name -eq $environment).variables | Foreach-Object {
    $CurrentObject = $_
    $CurrentObject | Get-Member -MemberType NoteProperty |
        Select-Object -Expand Name | Foreach-Object {
            $CurrentObject.$_.value
        }
}

Похоже, ваша проблема в том, что вы не знаете, какие переменные будут содержаться в вашем JSON. Таким образом, вы не можете легко использовать Select-Object variable или $object.variable. Вам нужен динамический c подход.


Если вы заранее знаете свои переменные, все становится проще. Вы можете хранить имена переменных в массиве и l oop поверх них.

$variables = 'Second_Staging','Staging','third_staging'
$environment = 'staging'
$j = $json | ConvertFrom-Json
$jsonVars = ($j.environments | where name -eq $environment).variables
$variables | Foreach-Object {
    $jsonVars.$_.value
}
...