Как примечание, это происходит, только когда вы запускаете весь фрагмент кода как один оператор (то есть как сценарий от ISE или копируете вставку всего фрагмента кода).Если вместо этого вы запускаете каждую строку инструкций отдельно из консоли PowerShell, вы получите ожидаемые результаты.
Как говорит @PetSerAl, проблема связана с форматированием. См. Мой ответ здесь для получения более подробной информации: Запуск строки за строкой дает нечетный результат по сравнению с бегущими строками в виде одной строки с точкой с запятой
Выполнение:
PS C:\> $Data = @()
>> foreach($i in 1..10) {
>> $Data += New-Object PSObject -Property @{
>> Money = 10
>> }
>> }
>>
>> echo "-----Data-----"
>> $Data
>>
>> echo "-----Measure-----"
>> $Data | Measure -Sum -Property "Money"
Выходы:
-----Data-----
Money
-----
10
10
10
10
10
10
10
10
10
10
-----Measure-----
Когда вы объединяете команды в одну, объект Первый будет определять формат вывода длявся линияИтак, посмотрев на типы, мы получим:
PS C:\> $Data.GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True Object[] System.Array
PS C:\> ($Data | Measure -Sum -Property "Money").GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True False GenericMeasureInfo Microsoft.PowerShell.Commands.MeasureInfo
В этом примере первый объект $Data
имеет тип Object[]
, и поэтому он попытается отформатировать все остальное в формате Object[]
.Поскольку вторая команда выводит объект типа GenericMeasureInfo
, он не может быть отформатирован таким же образом.Поскольку оба формата несовместимы, информация об объекте Measure отбрасывается и не выводится.
Когда вы закомментируете первый оператор $Data
, объект Measure - это единственное, что выводится, и да, вы видитеправильно отформатированный объект Measure.
Теперь давайте перевернем его:
PS C:\Temp> $Data = @()
>> foreach($i in 1..10) {
>> $Data += New-Object PSObject -Property @{
>> Money = 10
>> }
>> }
>> echo "-----Measure-----"
>> $Data | Measure -Sum -Property "Money"
>>
>> echo "-----Data-----"
>> $Data
Выходы:
-----Measure-----
Count : 10
Average :
Sum : 100
Maximum :
Minimum :
Property : Money
-----Data-----
Money : 10
Money : 10
Money : 10
Money : 10
Money : 10
Money : 10
Money : 10
Money : 10
Money : 10
Money : 10
Ну, это может показаться странным, потому что объект $Data
на этот раз вывел , но не в формате таблицы.Вместо этого он следовал другим правилам форматирования.Первый объект имеет тип GenericMeasureInfo
, поэтому он попытается отформатировать все остальное в формате GenericMeasureInfo
.Поскольку вторая команда выводит объект типа Object[]
, он не может быть отформатирован таким же образом.Но в этом случае вместо отбрасывания информации PowerShell выясняет, что может вернуться к выводу $Data
, отформатированному в виде списка (следовательно, вы видите "Money : 10"
).
Out-String
- это другой способ.действия:
PS C:\> $Data = @()
>> foreach($i in 1..10) {
>> $Data += New-Object PSObject -Property @{
>> Money = 10
>> }
>> }
>>
>> echo "-----Data-----"
>> $Data | Out-String
>>
>> echo "-----Measure-----"
>> $Data | Measure -Sum -Property "Money"
-----Data-----
Money
-----
10
10
10
10
10
10
10
10
10
10
-----Measure-----
Count : 10
Average :
Sum : 100
Maximum :
Minimum :
Property : Money
Out-String
работает в этом случае, потому что он преобразует формат типа выходного объекта из Object[]
в String
формат, в который объект Measure знает, как выводить.