Powershell retorna saída errada
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
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.