Невозможно вызвать getEnumerator () для ассоциативного массива из JSON в PowerShell - PullRequest
1 голос
/ 09 марта 2020
   Try {
    #Connect to PNP Online
    Connect-PnPOnline -Url $siteUrl -UseWebLogin
    $json = Get-PnPFile -Url $FolderRelativeURL -AsString
    Write-host $json.files
    $object = $json | ConvertFrom-Json
    $object.items | ForEach-Object { 
        Write-host $_.folder 
        $object.files.GetEnumerator() | ForEach-Object {"$($_.Key) - $($_.Value)"}

        #$item = Get-PnPFile -Url "$($FolderRelativeURLGeneral) $($_.folder)" -AsString
    }

}
catch {
    write-host "Error: $($_.Exception.Message)" -foregroundcolor Red
}

Я пытаюсь l oop через переменные внутри ключа files следующего json:

{
   "files":{
      "item":"item.html",
      "header":"header.html",
      "content":"content.html",
   },
   "items":[
      {
         "folder":"Advert",
         "file":"ad2.json"
      },
      {
         "folder":"YouTube",
         "file":"ad3.json"
      },
    ]
}

Однако метод GetEnumerator () не работает на файлы свойств объекта. Есть ли способ заставить его работать? Как ни странно, он работает для object.items.

Я получаю следующую ошибку при запуске сценария:

Error: Method invocation failed because [System.Management.Automation.PSCustomObject] does not contain a method named 'GetEnumerator'.

1 Ответ

2 голосов
/ 09 марта 2020

Как следует из сообщения об ошибке, ConvertFrom-Json выводит [pscustomobject] экземпляров (System.Management.Automation.PSCustomObject) по умолчанию - и этот тип не имеет перечислителя. [1]

В PowerShell [Core] 6 + вы можете использовать переключатель -AsHashtable, который возвращает [hashtable] экземпляр, который do имеет .GetEnumerator() method.

В Windows PowerShell необходимо перечислить свойства по-разному через (скрытый) набор .psobject.Properties (также работает в PowerShell [Core]):

$fromJson = @'
{
   "files":{
      "item":"item.html",
      "header":"header.html",
      "content":"content.html",
   },
   "items":[
      {
         "folder":"Advert",
         "file":"ad2.json"
      },
      {
         "folder":"YouTube",
         "file":"ad3.json"
      },
    ]
}
'@ | ConvertFrom-Json

$fromJson.Files.psobject.Properties | foreach {
  "$($_.Name) - $($_.Value)"
}

Обратите внимание на необходимость использования .Name вместо .Key; однако, если вы имеете дело с хеш-таблицами, обратите внимание, что .Name тоже работает.

Выше приведено:

item - item.html
header - header.html
content - content.html

Работает со свойством .Items, потому что он содержит массив ([object[]), а массивы имеют метод .GetEnumerator().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...