Powershell retorna saída errada

Sep 01 2020

Simplifiquei o processo para que qualquer pessoa possa reproduzi-lo (no meu script é um problema dentro de um workflow, nenhuma função envolvida, portanto não posso salvar esses valores em variáveis ​​e depois mostrá-los no console). A primeira coisa é usar o PowerShell ISE.

    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
    }
    
    função 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"
        retornar $ datum2
    }
    
    AAA
    BBB

Resultado:

    Coluna A Coluna B
    ------- -------
    AA BB     
    AA             

Alguma ideia de por que isso acontece?

EDIT: Eu resolvi esse "sh1t" da seguinte maneira

function AAA {
    $ datum1 = New-Object -TypeName PSObject
    $ datum1 | Add-Member -MemberType NoteProperty -Name Index -Value "1"
    $ datum1 | Add-Member -MemberType NoteProperty -Name ColumnA -Value "AA"
    $datum1 | Add-Member -MemberType NoteProperty -Name ColumnB -Value "BB"
    $datum1
}

função BBB {
    $ datum2 = New-Object -TypeName PSObject
    $ datum2 | Add-Member -MemberType NoteProperty -Name Index -Value "2"
    $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"
    $datum2
}

AAA |? {$ _. Índice -eq "1"} | FT 
BBB |? {$ _. Índice -eq "2"} | FT

Enfim, alguém pode explicar o que está acontecendo? Eu realmente gostaria de entender o motivo e procurar informações relacionadas

EDIT2: Responder a Palle Due,

não funciona de forma alguma para o meu cenário, pois adiciona um pouco mais de complexidade. Out-Hostnão é uma opção. Exemplo fornecido:

    fluxo de trabalho Get-Report
        {
            param ([string []]$computername)
            foreach -Parallel ($computador em $computername) {
                sequence {
                    InlineScript {
                        $AAA = Invoke-Command -ScriptBlock {
                            $datum1 = New-Object -TypeName PSObject
                            $datum1 | Add-Member -MemberType NoteProperty -Name Index -Value "1"
                            $datum1 | Add-Member -MemberType NoteProperty -Name ColumnA -Value "AA"
                            $datum1 | Add-Member -MemberType NoteProperty -Name ColumnB -Value "BB"
                            Retorna $datum1
                        }
                        $AAA | Out-Host
        
                        $BBB = Invoke-Command -ScriptBlock {
                            $datum2 = New-Object -TypeName PSObject
                            $datum2 | Add-Member -MemberType NoteProperty -Name Index -Value "2"
                            $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"
                            Retorna $datum2
                        }
                        $BBB | Out-Host
                    } #endinlinescript
                } #endsequence
            } #endforeach
        } #endWF
        
        $results = @()
        $resultados = Get-Report -Verbose -Computer "localhost", "localhost"
        $ resultados | FT

Respostas

PalleDue Sep 01 2020 at 15:29

A solução fácil é canalizar a saída para 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

dá a saída:

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

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

O fato é que o PowerShell gosta de gerar objetos personalizados com quatro membros ou menos horizontalmente. Com cinco ou mais membros, eles são produzidos verticalmente. E então um estranho princípio de limpeza entra em ação: se você produzir vários objetos em uma linha, o PowerShell tentará manter o mesmo formato. Portanto, se você começou horizontalmente, ele continuará horizontalmente e produzirá apenas membros com o mesmo nome do primeiro objeto personalizado. Se você começar verticalmente, ele continuará na vertical e produzirá todos os nomes.

É por isso que se você for:

BBB
AAA

você vai ter

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

ColumnA : AA
ColumnB : BB

em vez de.

Não consegui encontrar nenhuma documentação para isso. Eles são apenas minhas próprias observações.