Powershell devuelve un resultado incorrecto
He simplificado el proceso para que cualquiera pueda reproducirlo (en mi script es un problema dentro de un flujo de trabajo, no hay funciones involucradas, por lo tanto no puedo guardar estos valores en variables y luego mostrarlos por consola). Lo primero es utilizar powershell ISE.
función AAA {
$datum1 = New-Object -TypeName PSObject
$datum1 | Agregar-Miembro -MemberType NoteProperty -Name ColumnA -Value "AA"
$datum1 | Add-Member -MemberType NoteProperty -Name ColumnB -Value "BB"
return $datum1
}
función BBB {
$datum2 = New-Object -TypeName PSObject
$datum2 | Agregar-Miembro -MemberType NoteProperty -Name ColumnA -Value "AA"
$datum2 | Add-Member -MemberType NoteProperty -Name ColumnC -Value "CC"
$datum2 | Añadir-Miembro -MemberType NoteProperty -Name ColumnD -Value "DD"
$datum2 | Add-Member -MemberType NoteProperty -Name ColumnE -Value "EE"
$datum2 | Agregar-Miembro -MemberType NoteProperty -Name ColumnF -Value "FF"
return $ datum2
}
AAA
BBB
Salida:
ColumnaA ColumnaB
------- -------
AA BB
Automóvil club británico
¿Alguna idea de por qué sucede esto?
EDITAR: He resuelto este "sh1t" de la siguiente manera
función AAA {
$ datum1 = Nuevo-objeto -TypeName PSObject
$ datum1 | Agregar-Miembro -MemberType NoteProperty -Nombre Índice -Valor "1"
$ datum1 | Agregar-Miembro -MemberType NoteProperty -Name ColumnA -Value "AA"
$datum1 | Add-Member -MemberType NoteProperty -Name ColumnB -Value "BB"
$datum1
}
función BBB {
$ datum2 = Nuevo-objeto -TypeName PSObject
$ datum2 | Agregar-Miembro -MemberType NoteProperty -Nombre Índice -Valor "2"
$datum2 | Add-Member -MemberType NoteProperty -Name ColumnA -Value "AA"
$datum2 | Agregar-Miembro -MemberType NoteProperty -Name ColumnC -Value "CC"
$datum2 | Add-Member -MemberType NoteProperty -Name ColumnD -Value "DD"
$datum2 | Agregar-Miembro -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"} | PIE
De todos modos, ¿alguien puede explicar qué está pasando? Realmente me gustaría entender el motivo y buscar información relacionada
EDIT2: Responder a Palle Due,
no funciona en absoluto para mi escenario, ya que agrega un poco más de complejidad. Out-Hostno es una opinión. Ejemplo proporcionado:
flujo de trabajo Get-Report
{
param ([cadena []]$computername)
foreach -Parallel ($computadora en $computername) {
sequence {
InlineScript {
$AAA = Invocar-Comando -ScriptBlock {
$datum1 = New-Object -TypeName PSObject
$datum1 | Agregar-Miembro -MemberType NoteProperty -Nombre Índice -Valor "1"
$datum1 | Add-Member -MemberType NoteProperty -Name ColumnA -Value "AA"
$datum1 | Agregar-Miembro -MemberType NoteProperty -Name ColumnB -Value "BB"
regreso $datum1
}
$AAA | Anfitrión externo
$BBB = Invoke-Command -ScriptBlock {
$datum2 = Nuevo-objeto -TypeName PSObject
$datum2 | Add-Member -MemberType NoteProperty -Name Index -Value "2"
$datum2 | Agregar-Miembro -MemberType NoteProperty -Name ColumnA -Value "AA"
$datum2 | Add-Member -MemberType NoteProperty -Name ColumnC -Value "CC"
$datum2 | Añadir-Miembro -MemberType NoteProperty -Name ColumnD -Value "DD"
$datum2 | Add-Member -MemberType NoteProperty -Name ColumnE -Value "EE"
$datum2 | Agregar-Miembro -MemberType NoteProperty -Name ColumnF -Value "FF"
regreso $datum2
}
$BBB | Anfitrión externo
} #endinlinescript
} #endsequence
} #endforeach
} #endWF
$results = @()
$resultados = Obtener-Informe -Verbose -Computadora "localhost", "localhost"
$ resultados | PIE
Respuestas
La solución fácil es canalizar la salida a 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
da la salida:
ColumnA ColumnB
------- -------
AA BB
ColumnA : AA
ColumnC : CC
ColumnD : DD
ColumnE : EE
ColumnF : FF
Lo que pasa es que a powershell le gusta generar objetos personalizados con cuatro miembros o menos horizontalmente. Con cinco o más miembros, se emiten verticalmente. Y luego entra en juego un extraño principio de limpieza: si genera varios objetos seguidos, powershell intentará mantener el mismo formato. Entonces, si comenzó horizontalmente, continuará horizontalmente y solo generará miembros con el mismo nombre que el primer objeto personalizado. Si comienza verticalmente, continuará verticalmente y mostrará todos los nombres.
Por eso si vas:
BBB
AAA
conseguirás
ColumnA : AA
ColumnC : CC
ColumnD : DD
ColumnE : EE
ColumnF : FF
ColumnA : AA
ColumnB : BB
en lugar.
No he podido encontrar ninguna documentación para esto. Son solo mis propias observaciones.