脚本中有多个对象的powershell写输出错误?

js2*_*010 5 powershell

这是一个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
Run Code Online (Sandbox Code Playgroud)

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

$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
Run Code Online (Sandbox Code Playgroud)

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

Win*_*dos 3

认为这是 cmdlet 的预期行为Write-Output。它沿着管道发送对象(如果它是管道中的最后一个 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
Run Code Online (Sandbox Code Playgroud)

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

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