【问题标题】:powershell write-output bug with multiple objects in a script? [duplicate]脚本中有多个对象的powershell写输出错误? [复制]
【发布时间】:2019-10-29 02:10:08
【问题描述】:

这是一个 powershell 错误吗?它只会在脚本中打印 $var1,而不是 $var2(我也不能将它通过管道传输到 where-object)。但是当我将它复制并粘贴到命令行时,它工作正常。

$var1 = New-Object -TypeName PSObject -Prop @{'data1'=6}
write-output $var1
$var2 = New-Object -TypeName PSObject -Prop @{'data2'=12}
write-output $var2


data1
------
6

编辑:我想我开始明白了。这是一个更奇怪的例子。您只能从第二个对象输出或处理公共字段:

$var1 = New-Object PSObject -prop @{data1=6;data3=5}
$var1
$var2 = New-Object PSObject -prop @{data2=12;data3=6}
$var2


data1 data3
----- -----
    6     5
          6

EDIT2:这与格式表的隐含运行以及它如何设置列有关。

【问题讨论】:

    标签: powershell


    【解决方案1】:

    认为这是Write-Output cmdlet 的预期行为。它沿着管道发送对象(如果它是管道中的最后一个 cmdlet,它会显示给主机。)它期望管道中的所有对象都具有相同的属性。

    在您的示例中,您有一个具有data1 属性的对象和另一个具有data2 属性的对象。如果你让你的两个对象使用相同的属性,它会像你期望的那样工作:

    $var1 = New-Object -TypeName PSObject -Prop @{'data1'=6}
    write-output $var1
    $var2 = New-Object -TypeName PSObject -Prop @{'data1'=12}
    write-output $var2
    
    data1
    -----
        6
       12
    

    这样想,cmdlet 通常输出单个可预测的对象(Get-AdUser 输出 AdUser 对象。)如果 Get-AdUser 输出少量 AdUser,管道和其他 cmdlet 将无法处理它, AdGroup、Mailbox 和 NTFSPermissions 作为一个数据流。

    编辑:顺便说一句,如果您只是想在屏幕上获取信息而不使用Write-Host,请考虑Write-Information

    【讨论】:

    • "...当 [Out-Default] 将流发送到 Format-Table 时,该命令需要生成列。它通过查看 FIRST OBJECT 的属性来做到这一点——这些成为列。如果第一个对象有 2 个属性,即使流中的所有其他对象都有 10 个属性,您也会得到一个 2 列的表。 -- blogs.msdn.microsoft.com/powershell/2006/04/29/…
    猜你喜欢
    • 2017-03-08
    • 1970-01-01
    • 2021-01-19
    • 2022-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-30
    • 2015-09-13
    相关资源
    最近更新 更多