#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.$_ }