Como a formatação funciona com uma função do PowerShell que retorna um conjunto de elementos?

2

Se eu escrever esta pequena função:

function Foo {
    Get-Process | % { $_ } 
} 

E se eu correr

Foo

Exibe apenas um pequeno subconjunto de propriedades:

PS C:\Users\Administrator> foo

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
-------  ------    -----      ----- -----   ------     -- -----------
     86      10     1680        412    31     0,02   5916 alg
    136      10     2772       2356    78     0,06   3684 atieclxx
    123       7     1780       1040    33     0,03    668 atiesrxx
...
...

Mas, mesmo que apenas 8 colunas sejam exibidas, há muitas outras propriedades (como mostra foo | gm ).

O que está causando essa função para mostrar apenas estas 8 propriedades?

Na verdade, estou tentando construir uma função semelhante que está retornando objetos complexos de uma biblioteca de terceiros da Net. A biblioteca está nivelando uma hierarquia de 2 níveis de objetos:

function Actual {

    $someDotnetObject.ACollectionProperty.ASecondLevelCollection | % { $_ }

}

Este método está descarregando os objetos em um formulário de lista (uma linha por propriedade).

Como posso controlar o que é exibido, mantendo o objeto real disponível ?

Eu tentei isso:

function Actual {

    $someDotnetObject.ACollectionProperty.ASecondLevelCollection | % { $_ } | format-table Property1, Property2

}

Ele mostra em um console a tabela esperada:

Property1  Property2
---------  ---------
     ValA       ValD
     ValB       ValE
     ValC       ValF

Mas eu perdi meus objetos. A exibição de Get-Member no resultado mostra:

   TypeName: Microsoft.PowerShell.Commands.Internal.Format.FormatStartData

Name                                    MemberType Definition                                                                              
----                                    ---------- ----------                                                                              
Equals                                  Method     bool Equals(System.Object obj)                                                          
GetHashCode                             Method     int GetHashCode()                                                                       
GetType                                 Method     type GetType()                                                                          
ToString                                Method     string ToString()                                                                       
autosizeInfo                            Property   Microsoft.PowerShell.Commands.Internal.Format.AutosizeInfo autosizeInfo {get;set;}      
ClassId2e4f51ef21dd47e99d3c952918aff9cd Property   System.String ClassId2e4f51ef21dd47e99d3c952918aff9cd {get;}                            
groupingEntry                           Property   Microsoft.PowerShell.Commands.Internal.Format.GroupingEntry groupingEntry {get;set;}    
pageFooterEntry                         Property   Microsoft.PowerShell.Commands.Internal.Format.PageFooterEntry pageFooterEntry {get;set;}
pageHeaderEntry                         Property   Microsoft.PowerShell.Commands.Internal.Format.PageHeaderEntry pageHeaderEntry {get;set;}
shapeInfo                               Property   Microsoft.PowerShell.Commands.Internal.Format.ShapeInfo shapeInfo {get;set;}            


   TypeName: Microsoft.PowerShell.Commands.Internal.Format.GroupStartData

Name                                    MemberType Definition                                                                          
----                                    ---------- ----------                                                                          
Equals                                  Method     bool Equals(System.Object obj)                                                      
GetHashCode                             Method     int GetHashCode()                                                                   
GetType                                 Method     type GetType()                                                                      
ToString                                Method     string ToString()                                                                   
ClassId2e4f51ef21dd47e99d3c952918aff9cd Property   System.String ClassId2e4f51ef21dd47e99d3c952918aff9cd {get;}                        
groupingEntry                           Property   Microsoft.PowerShell.Commands.Internal.Format.GroupingEntry groupingEntry {get;set;}
shapeInfo                               Property   Microsoft.PowerShell.Commands.Internal.Format.ShapeInfo shapeInfo {get;set;}        

Em vez de mostrar os membros do objeto filho de 2º nível. Neste caso, não posso canalizar o resultado para funções que aguardam esse tipo de argumento.

Como o Powershell deve lidar com esse cenário?

    
por Steve B 04.09.2012 / 17:16

2 respostas

1

Isso é realmente controlado por arquivos de formato. Do powershell help about_Format.ps1xml :

The Format.ps1xml files in Windows PowerShell define the default display of objects in Windows PowerShell. You can create your own Format.ps1xml files to change the display of objects or to define default displays for new object types that you create in Windows PowerShell.

When Windows PowerShell displays an object, it uses the data in structured formatting files to determine the default display of the object. The data in the formatting files determines whether the object is rendered in a table or in a list, and it determines which properties are displayed by default.

The formatting affects the display only. It does not affect which object properties are passed down the pipeline or how they are passed.

Conforme seu exemplo, get-process retorna System.Diagnostics.Process , que (formato de saída) é definido em DotNetTypes.format.ps1xml :

    <Name>process</Name>
    <ViewSelectedBy>
        <TypeName>System.Diagnostics.Process</TypeName>
    </ViewSelectedBy>
    <TableControl>
        <TableHeaders>
            <TableColumnHeader>
                <Label>Handles</Label>
                <Width>7</Width>
                <Alignment>right</Alignment>
            </TableColumnHeader>
            <TableColumnHeader>
                <Label>NPM(K)</Label>
                <Width>7</Width>
                <Alignment>right</Alignment>
            </TableColumnHeader>
(output omitted)
    
por 04.09.2012 / 19:38
0

Tente algo assim:

... | ForEach-Object {
  Write-Host $_.Something
  $_
}

O trailing $_ dentro do bloco de código passa o objeto.

    
por 04.09.2012 / 17:32

Tags