проблема с преобразованием powershell json корректна только при сохранении в переменную - PullRequest
2 голосов
/ 24 апреля 2020

Json преобразование с результатом

> $container=az container list -o json|convertfrom-json
> $container|select name,provisioningstate

Выход:

name           provisioningState
----           -----------------
master         Succeeded
pasbackground1 Succeeded
sftp           Succeeded

Json преобразование без между результатом

> az container list -o json|convertfrom-json|select name,provisioningstate

Вывод:

 name provisioningstate
---- -----------------

Я бы ожидал того же результата, что и выше.

зачем сохранять временный результат дает результаты, отличные от тех, которые заданы в строке.

1 Ответ

3 голосов
/ 24 апреля 2020

По умолчанию механизм выполнения развертывает (или перечисляет ) все типы коллекций при подаче вывода в командлет dowstream

Однако ConvertFrom-Json в версиях PowerShell до v6.x возвращает его результаты таким образом, что предотвращает их перечисление во время выполнения , поэтому следующий командлет в конвейере получает массив [object[]] в виде отдельного элемента конвейера.

Это можно решить в количество путей:

  • Вложите начальный конвейер:
(az container list -o json |ConvertFrom-Json) |Select Name,ProvisioningState
  • Позвольте ForEach-Object развернуть массив при возврате:
az container list -o json |ConvertFrom-Json |ForEach { $_ } |Select Name,ProvisioningState
  • Используйте промежуточную переменную (как вы уже нашли):
$containers = az container list -o json |ConvertFrom-Json 
$containers |Select Name,ProvisioningState
  • Обновите до новой версии PowerShell
    • поведение по умолчанию было изменено в PowerShell [Core] 7.0
if($PSVersionTable['PSVersion'].Major -ge 7){
  az container list -o json |ConvertFrom-Json |Select Name,ProvisioningState
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...