$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不出所料。为什么?为什么相同的语句返回不同的结果?
发布于 2019-05-09 01:48:50
请注意,仅当您将整个代码片段作为单个语句运行时(即,作为ISE中的脚本,或复制或粘贴整个代码片段),才会发生这种情况。相反,如果您从PowerShell控制台单独运行每个语句行,您将获得预期的结果。
正如@PetSerAl所说,这个问题与格式有关,有关更多细节,请参阅我的答案:Running Line by Line Produces Odd Result Compared to Running Lines as a Single Line with Semicolons
运行:
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语句时,度量对象是惟一输出的对象,是的,您会看到一个格式正确的度量对象。
现在,让我们反转一下:
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 : MoneyOut-String在这种情况下工作,因为它将输出对象类型格式从Object[]转换为String格式,度量对象知道如何输出到这种格式。
发布于 2019-05-09 01:07:34
正如@LotPings所说,使用输出字符串代码可以按预期工作。
发布于 2019-05-09 01:57:11
这是一个常见的陷阱。Format-table是隐式运行的,它不知道如何显示不同的列集。通过format-list传输脚本可以正常工作。另一个奇怪的解决方法是将get-date放在脚本的开头。出于某些原因,顶部的已知对象类型(具有格式化文件)会使输出“更好”。对于各个命令,也可以使用format-table和format-date。
https://stackoverflow.com/questions/56029413
复制相似问题