Измерить -Sum -Property не производит вывод - PullRequest
0 голосов
/ 07 мая 2019
$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-----

Если вы запустите этот код, вы увидите, что строка $Data | Measure -Sum -Property "Money" не генерирует никакого вывода. НО! если вы закомментируете строку $Data, вы получите

-----Data-----
-----Measure-----


Count    : 10
Average  : 
Sum      : 100
Maximum  : 
Minimum  : 
Property : Money

как и ожидалось. Зачем???? Почему одни и те же утверждения дают разные результаты ???

Ответы [ 3 ]

1 голос
/ 08 мая 2019

Как примечание, это происходит, только когда вы запускаете весь фрагмент кода как один оператор (то есть как сценарий от 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 знает, как выводить.

0 голосов
/ 08 мая 2019

Это обычная ошибка. Формат-таблица неявно работает, и она не знает, как отображать различные наборы столбцов. Пропускание скрипта через format-list работает нормально. Другой странный обходной путь - поставить дату начала в начале скрипта. По какой-то причине известный тип объекта (который имеет файл формата) вверху делает вывод «лучше». Вы также можете использовать format-table и format-date для отдельных команд.

0 голосов
/ 08 мая 2019

Как сказал @LotPings, код Out-String работает как положено.

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