powershell - 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
正如预期的那样。为什么????为什么相同的语句返回不同的结果???
解决方案
请注意,这仅在您将整个代码片段作为单个语句运行(即作为来自 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
推荐阅读
- xslt - 用于 xslt 中的每个
- react-native - React Native 应用程序没有按预期崩溃
- c# - PowerShell Selenium 代码等待元素属性具有特定值
- java - java.lang.IllegalAccessException:.cannot 使用修饰符“private static”访问类 CrossOrigin 的成员
- x86-64 - 我正确猜到了函数的缺失部分,但 gcc 生成的汇编代码与答案不匹配
- vuetify.js - Vuetify - Changing v-tabs via key
- django - Multiple POST request is not working after submit
- python - OptionError while trying to set chained_assigment to None in pandas
- javascript - Created raster is not following mouse
- mysql - 如何获取sql每天的记录总数