首页 > 解决方案 > Powershell 返回错误的输出

问题描述

我已经简化了该过程,以便任何人都可以重现它(在我的脚本中,这是工作流中的一个问题,不涉及任何函数,因此我无法将这些值保存在变量中,然后通过控制台显示它们)。首先是使用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
    $基准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"
    $基准1
}

功能 BBB {
    $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"
    $基准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"
        $结果 | 英尺

标签: powershell

解决方案


简单的解决方法是将输出通过管道传输到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

反而。

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


推荐阅读