【问题标题】:Powershell returns wrong outputPowershell 返回错误的输出
【发布时间】:2020-12-20 07:09:22
【问题描述】:

我已经简化了这个过程,以便任何人都可以重现它(在我的脚本中,这是工作流程中的一个问题,不涉及任何函数,因此我无法将这些值保存在变量中,然后通过控制台显示它们)。首先是使用powershell ISE。

功能AAA { $datum1 = 新对象 -TypeName PSObject $基准1 | Add-Member -MemberType NoteProperty -Name ColumnA -Value "AA" $基准1 | Add-Member -MemberType NoteProperty -Name ColumnB -Value "BB" 返回 $datum1 } 功能 BBB { $datum2 = 新对象 -TypeName PSObject $基准2 | Add-Member -MemberType NoteProperty -Name ColumnA -Value "AA" $基准2 | Add-Member -MemberType NoteProperty -Name ColumnC -Value "CC" $基准2 | Add-Member -MemberType NoteProperty -Name ColumnD -Value "DD" $基准2 | Add-Member -MemberType NoteProperty -Name ColumnE -Value "EE" $基准2 | Add-Member -MemberType NoteProperty -Name ColumnF -Value "FF" 返回 $datum2 } AAA BBB

输出:

A 列 B 列 -------- -------- AA BB AA

知道为什么会这样吗?

编辑: 我通过以下方式解决了这个“sh1t”

功能AAA { $datum1 = 新对象 -TypeName PSObject $datum1 | Add-Member -MemberType NoteProperty -Name Index -Value "1" $基准1 | Add-Member -MemberType NoteProperty -Name ColumnA -Value "AA" $基准1 | Add-Member -MemberType NoteProperty -Name ColumnB -Value "BB" $基准1 } 功能 BBB { $datum2 = 新对象 -TypeName PSObject $datum2 | Add-Member -MemberType NoteProperty -Name Index -Value "2" $基准2 | Add-Member -MemberType NoteProperty -Name ColumnA -Value "AA" $基准2 | Add-Member -MemberType NoteProperty -Name ColumnC -Value "CC" $基准2 | Add-Member -MemberType NoteProperty -Name ColumnD -Value "DD" $基准2 | Add-Member -MemberType NoteProperty -Name ColumnE -Value "EE" $基准2 | Add-Member -MemberType NoteProperty -Name ColumnF -Value "FF" $基准2 } AAA |? {$_.Index -eq "1"} |英尺 BBB |? {$_.Index -eq "2"} |英尺

无论如何,有人可以解释发生了什么吗?我很想了解原因并寻找相关信息

EDIT2:回复 Palle Due,

它对我的场景根本不起作用,因为它增加了一些复杂性。 Out-Host 不是一个选项。提供的示例:

工作流获取报告 { 参数([字符串[]]$计算机名) foreach -Parallel ($computer in $computername) { 顺序 { 内联脚本 { $AAA = 调用命令 -ScriptBlock { $datum1 = 新对象 -TypeName PSObject $基准1 | Add-Member -MemberType NoteProperty -Name Index -Value "1" $基准1 | Add-Member -MemberType NoteProperty -Name ColumnA -Value "AA" $基准1 | Add-Member -MemberType NoteProperty -Name ColumnB -Value "BB" 返回 $datum1 } $AAA |主机外 $BBB = 调用命令 -ScriptBlock { $datum2 = 新对象 -TypeName PSObject $基准2 | Add-Member -MemberType NoteProperty -Name Index -Value "2" $基准2 | Add-Member -MemberType NoteProperty -Name ColumnA -Value "AA" $基准2 | Add-Member -MemberType NoteProperty -Name ColumnC -Value "CC" $基准2 | Add-Member -MemberType NoteProperty -Name ColumnD -Value "DD" $基准2 | Add-Member -MemberType NoteProperty -Name ColumnE -Value "EE" $基准2 | Add-Member -MemberType NoteProperty -Name ColumnF -Value "FF" 返回 $datum2 } $BBB |主机外 } #endinlinescript } #endsequence } #endforeach } #endWF $结果 = @() $results = Get-Report -Verbose -Computer "localhost","localhost" $结果 |英尺

【问题讨论】:

  • 我无法解释发生了什么,但我有一些观察。 BBB 具有正确的属性,如果您之后评估 BBB,您可以看到。显然只显示了常见的属性。如果您将ColumnB 属性添加到$datum2,也会显示。如果你调用 BBB AAA,你会得到预期的输出,但不是表格。

标签: powershell


【解决方案1】:

简单的解决方法是将输出通过管道传输到Out-Host

function AAA {
    $datum1 = New-Object -TypeName PSObject
    $datum1 | Add-Member -MemberType NoteProperty -Name ColumnA -Value "AA"
    $datum1 | Add-Member -MemberType NoteProperty -Name ColumnB -Value "BB"
    return $datum1
}
    
function BBB {
    $datum2 = New-Object -TypeName PSObject
    $datum2 | Add-Member -MemberType NoteProperty -Name ColumnA -Value "AA"
    $datum2 | Add-Member -MemberType NoteProperty -Name ColumnC -Value "CC"
    $datum2 | Add-Member -MemberType NoteProperty -Name ColumnD -Value "DD"
    $datum2 | Add-Member -MemberType NoteProperty -Name ColumnE -Value "EE"
    $datum2 | Add-Member -MemberType NoteProperty -Name ColumnF -Value "FF"
    return $datum2
}
    
AAA | Out-Host
BBB | Out-Host

给出输出:

ColumnA ColumnB
------- -------
AA      BB     

ColumnA : AA
ColumnC : CC
ColumnD : DD
ColumnE : EE
ColumnF : FF

问题是 powershell 喜欢水平输出四个或更少成员的自定义对象。有五个或更多成员时,它们会垂直输出。然后出现了一些奇怪的整洁原则:如果您连续输出多个对象,powershell 将尝试保持相同的格式。因此,如果您从水平开始,它将继续水平运行,并且仅输出与第一个自定义对象同名的成员。如果您从垂直开始,它将继续垂直并输出所有名称。

这就是为什么如果你去:

BBB
AAA

你会得到

ColumnA : AA
ColumnC : CC
ColumnD : DD
ColumnE : EE
ColumnF : FF

ColumnA : AA
ColumnB : BB

改为。

我还没有找到任何文档。它们只是我自己的观察。

【讨论】:

  • 列数无关紧要,第一个函数有两列,第二个函数有三列,同样的问题是同样可重现的。 out-host 是一个很好的函数解决方案,因为您强制在 shell 中生成同步输出,但我个人正在尝试处理工作负载,我无法在每次有输出时都进行绘制,但首先我必须收集信息并为在工作流程中都停止工作。我留下了一个示例作为答案,因为文本太长而无法作为评论留下。
  • 成员数量确实很重要。如果您分别有两个和三个成员,则两者都将水平输出并触发“仅打印通用属性”的事情。即使没有任何共同的属性。
  • 哦,很抱歉,真的!!具有五列或更多列的两个函数可以正常工作。
猜你喜欢
  • 2013-07-23
  • 1970-01-01
  • 1970-01-01
  • 2022-10-23
  • 2011-06-04
  • 2021-09-03
  • 2015-09-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多