首页 > 解决方案 > Measure -Sum -Property 不产生输出

问题描述

$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

正如预期的那样。为什么????为什么相同的语句返回不同的结果???

标签: powershell

解决方案


请注意,这仅在您将整个代码片段作为单个语句运行(即作为来自 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-----

当您将命令链接成一个时,First对象将确定整行的输出格式。所以看看我们得到的类型:

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它不能以相同的方式格式化。由于这两种格式不兼容,因此测量对象信息被丢弃并且不输出。

当您注释掉第一$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对象确实输出了,但它没有以表格格式输出。相反,它遵循不同的格式规则。第一个对象是 type 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在这种情况下有效,因为它将输出对象类型格式从格式转换为 Measure 对象知道如何输出Object[]的格式。String


推荐阅读