ConvertFrom-Json
, в отличие от большинства других командлетов, выводит массивы в виде отдельных объектов вместо отправки объектов один за другим по конвейеру. [1]
Следовательно, в вашем первом блоке сценария %
(ForEach-Object
) команды $_
представляет собой весь массив , который внутри расширяемой строки ("..."
) переводит в список его элементов, разделенных пробелами по умолчанию.
В отличие от этого, , включающий команду в (...)
, превращает ее в выражение и используетвыражение в конвейере неявно вызывает перечисление результата выражения , вызывая отправку объектов один за другим.
Следовательно, ваша секунда команды %
(ForEach-Object
) блок сценария вызывается дважды , с $_
, привязанным к одному объекту каждый.
Упрощенные примеры:
# Sample JSON that is an array comprising 2 objects.
$json = '[
{
"MessageType": "A"
},
{
"MessageType": "B"
}
]'
# -> 1, because ConvertFrom-Json sent the array as a whole
$json | ConvertFrom-Json | Measure-Object | % Count
# -> 2, because using (...) resulted in enumeration
($json | ConvertFrom-Json) | Measure-Object | % Count
[1] Это необычное поведение обсуждается в этом выпуске GitHub .