Почему в PowerShell v3 сохранение результата выражения приводит к другому объекту? - PullRequest
0 голосов
/ 25 апреля 2019

Этот вопрос только для того, чтобы углубить моё понимание PowerShell.

Я пытаюсь понять, что на самом деле происходит под прикрытием при взаимодействии с каналом с помощью команды measure, по сравнению с тем, когда я сохраняю результаты канала в переменной и использую меру на нем. Я получаю разные объекты / значения.

Если я впервые сделаю:

echo '[1,2,3,4,5]' | ConvertFrom-Json | measure

Я получаю:

Count    : 1
Average  : 
Sum      : 
Maximum  : 
Minimum  : 
Property : 

Однако, если я запишу результат в переменную и сделаю:

$obj = echo '[1,2,3,4,5]' | ConvertFrom-Json
$obj | measure

Я получаю:

Count    : 5
Average  : 
Sum      : 
Maximum  : 
Minimum  : 
Property : 

Я вижу тип переменной $obj: System.Array.

PS> $obj.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Object[]                                 System.Array

Я не знаю, чтобы увидеть тип, когда в трубе передается команде measure (думаю, что это тип объекта).

1 Ответ

4 голосов
/ 25 апреля 2019

Поведение должно стать более понятным, если вы посмотрите на фактический результат преобразования, заменив Measure-Object на Get-Member:

PS C:\> <b>echo '[1,2,3,4,5]' | ConvertFrom-Json | Get-Member</b>

   <i><b>TypeName: System.Object[]</b></i>

Name           MemberType            Definition
----           ----------            ----------
Count          AliasProperty         Count = Length
...
PS C:\> <b>$obj = echo '[1,2,3,4,5]' | ConvertFrom-Json</b>
PS C:\> <b>$obj | Get-Member</b>

   <i><b>TypeName: System.Int32</b></i>

Name        MemberType Definition
----        ---------- ----------
CompareTo   Method     int CompareTo(System.Object value), int Compa...
...

По сути, ConvertTo-Json создает объект массива, который используется следующим командлетом как есть. Следовательно, Measure-Object считает только один элемент (массив).

При захвате объекта в переменную перед передачей его следующему командлету массив развертывается, так что Measure-Object видит (и считает) элементы массива.

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

PS C:\> <b>$obj = echo '[1,2,3,4,5]' | ConvertFrom-Json</b>
PS C:\> <b>$obj | Measure-Object</b>

<i>Count    : 5</i>
Average  :
Sum      :
Maximum  :
Minimum  :
Property :

PS C:\> <b>(echo '[1,2,3,4,5]' | ConvertFrom-Json) | Measure-Object</b>

<i>Count    : 5</i>
Average  :
Sum      :
Maximum  :
Minimum  :
Property :
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...