Tenho duas consultas separadas em um arquivo xml, quando as executo separadamente elas funcionam bem. No entanto, quando as executo no mesmo script, a saída da segunda consulta não está correta.
O arquivo de entrada se parece com isto:
<?xml version='1.0' encoding='UTF-8' standalone='no'?>
<Safex>
<Add>
<User folder="/" name="D2\\[email protected]">
<GroupMembership>ADMINS</GroupMembership>
<GroupMembership>WebService</GroupMembership>
</User>
<User folder="/" name="D2\\[email protected]">
<GroupMembership>WebService</GroupMembership>
</User>
<User folder="/" name="D2\\[email protected]">
<GroupMembership>WebService</GroupMembership>
</User>
<User folder="/" name="D2\\[email protected]">
<GroupMembership>ADMINS</GroupMembership>
</User>
<User folder="/" name="D2\\[email protected]">
<GroupMembership>WebService</GroupMembership>
</User>
</Add>
</Safex>
Meu script é o seguinte:
[xml]$xml = Get-Content $InputPath\test002.xml
$a = $xml.Safex.Add.User | ForEach-Object {
[PSCustomObject]@{
'Name' = $_.name
'Group' = $_.GroupMembership
}
}
$a
$b = $xml.Safex.Add.User | Where-Object { $_.GroupMembership -eq 'WebService' } |
Select-Object @{Name = 'Name'; Expression = {$_.Name}}, GroupMembership
#$b
Quando $b é comentado, $a retorna isto:
Name Group
---- -----
D2\\[email protected] {ADMINS, WebService}
D2\\[email protected] WebService
D2\\[email protected] WebService
D2\\[email protected] ADMINS
D2\\[email protected] WebService
Quando $a é comentado, $b retorna isto:
Name GroupMembership
---- ---------------
D2\\[email protected] {ADMINS, WebService}
D2\\[email protected] WebService
D2\\[email protected] WebService
D2\\[email protected] WebService
Quando tenho $a e $b descomentários, recebo isto:
Name Group
---- -----
D2\\[email protected] {ADMINS, WebService}
D2\\[email protected] WebService
D2\\[email protected] WebService
D2\\[email protected] ADMINS
D2\\[email protected] WebService
D2\\[email protected]
D2\\[email protected]
D2\\[email protected]
D2\\[email protected]
Não consigo entender por que, quando $a e $b não estão comentados, o título de $b não aparece e os valores de GroupMembership não aparecem.
Agradecemos qualquer ajuda que você possa oferecer.
Use os mesmos nomes de propriedade (mesmos cabeçalhos) em ambos os arrays de objetos (
$a
e$b
) para que seu código funcione corretamente. Caso contrário, você terá um problema semelhante ao explicado em PowerShell Export-CSV - Missing Columns .A causa raiz é que suas linhas
e
gerar saída não capturada no contexto de script de nível superior e, assim, resultar em uma chamada implícita para
Out-Default
exibir a saída no console.Isso está então passando toda a saída de ambas as linhas para uma única chamada para
Format-Table
que tem uma peculiaridade que espera por 300 ms para que mais dados cheguem antes de decidir quais colunas exibir. Parece que nesses 300 ms apenas os dados de$a
são recebidos, então ele está bloqueando as colunas paraName
eGroup
. Quando a saída de$b
é recebida, ele não adiciona aGroupMembership
coluna automaticamente.A resposta de @Santiago Squarzon contorna isso alinhando os nomes das propriedades em
$a
e$b
assim as colunas determinadas porFormat-Table
são consistentes em toda a saída.Outra opção é canalizar explicitamente as variáveis individuais
Format-Table
assim:que renderizará duas tabelas separadas com suas próprias colunas calculadas com base na entrada de cada chamada separada para
format-table
, e resultará nisso no console:Veja estes links para mais detalhes técnicos sangrentos: