Сравнение CSV с объектами JSON в Powershell

#json #powershell #csv #object

#json #powershell #csv #объект

Вопрос:

Я хочу создать базовый конфигурационный файл с помощью JSON. Для начала я запрашиваю базу данных SQL, чтобы получить 3 значения. Эти 3 значения хранятся в формате CSV, я хотел бы просмотреть свой конфигурационный файл JSON в поисках соответствия. В случае совпадения я хотел бы передать заголовок и все пары ключей переменной Powershell.

Мне удалось заставить это работать, используя CSV в качестве файла конфигурации, но, похоже, JSON не поддерживает «.где», и я полностью застрял.

Это мой файл JSON. 3 значения, которые я сравниваю с моим файлом SQL, — это DFS, очередь сообщений, ошибки. Если они совпадут, я хотел бы в конечном итоге отправить электронное письмо команде, присвоившей 3 значения.

 {  "Messagequeue1": [  {  "dfs": "OAKHILL",  "Messagequeue": "IMPORTSEQ",  "errormsg": "Input in non-input field",  "Ignore" : "false",  "team": "ben@team.com.au",  "teamcc": "middle-office@team.com.au",  "escalate": "60"  }  ]  ,"Messagequeue2": [  {  "dfs": "MQ",  "Messagequeue": "MX",  "errormsg": "ERRORMESS",  "Ignore" : "false",  "team": "middle-office@team.com.au",  "teamcc": "",  "escalate": "60"  }   ] }   

Powershell Ниже.

 $json = "C:TempExample.json" $MessageQueue = Get-Content -Path $json | ConvertFrom-Json   $Param = @{  Header = 'DFS','MessageQueue','ErrorMessage','CreatedDate','StartTime'  Path = 'C:tempfile.csv' } $SqlFile = Import-Csv @Param | Select-Object -Skip 2 | Select-Object -SkipLast 2   $teamemails = @{} $itsemails = @()  $MessageQueue | gm -MemberType Methods  ForEach ($sqlerror In $SqlFile){    if ($Config = $MessageQueue.where({ $_.DFS -Match $sqlerror.DFS -And $_.ErrorMsg -Match $sqlerror.ErrorMessage -And $_.MessageQueue -Match $sqlerror.MessageQueue}))  {    Write-Host "Match sending to " -NoNewline  Write-Output -InputObject $Config.Team   foreach ($c in $config)  {  $c.Resend    if ($teamemails[$c.Team] -eq $null) {  $teamemails[$c.Team] = @()  }   $teamemails[$c.Team]  = $sqlerror  }  }    else {  Write-host 'No Match sending to default'  $itsemails  = $sqlerror  } }  

Комментарии:

1. На первый взгляд, ваше $MessageQueue.where({...}) утверждение неверно, вы пытаетесь сослаться на вложенные свойства Messagequeue1 и Messagequeue2 . Попробуйте, например, это, чтобы увидеть разницу: $MessageQueue = Get-Content -Path $json | ConvertFrom-Json =gt; $MessageQueue.PSObject.Properties.ForEach({$_.where({$_.Value.DFS -eq 'OAKHILL'})}).Value

Ответ №1:

$MessageQueue содержит один пользовательский объект с двумя свойствами MessageQueue1 и MessageQueue2 .Where({}) осмысленно работает только с коллекциями.

Вы можете изменить условие для тестирования @($MessageQueue.MessageQueue1, $MessageQueue.MessageQueue2).Where({...}) , но это, очевидно, нарушится, если файл json содержит больше свойств.

Вы можете использовать скрытый psobject набор участников для перечисления свойств, подобных этому:

 # create a flat array from the individual property values $MessageQueue = $MessageQueue.psobject.Properties |ForEach-Object Value  

… или используйте Get-Member , чтобы узнать имена свойств:

 # same as above, create a flat array from the individual property values $MessageQueue = ($MessageQueue |Get-Member -MemberType Property) |ForEach-Object { $MessageQueue.$_ }