2

Если я напишу эту маленькую функцию:

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

И если я бегу

Foo

Он отображает только небольшое подмножество свойств:

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
...
...

Но даже если отображаются только 8 столбцов, есть много других свойств (как показывает foo | gm ).

Что заставляет эту функцию показывать только эти 8 свойств?

Я на самом деле пытаюсь создать аналогичную функцию, которая возвращает сложные объекты из сторонней библиотеки .Net. Библиотека выравнивает двухуровневую иерархию объектов:

function Actual {

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

}

Этот метод создает дамп объектов в виде списка (одна строка на свойство).

Как я могу контролировать то, что отображается, сохраняя фактический объект доступным?

Я попробовал это:

function Actual {

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

}

В консоли отображается ожидаемая таблица:

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

Но я потерял свои предметы. Запуск Get-Member по результату показывает:

   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;}        

Вместо показа членов дочернего объекта 2-го уровня. В этом случае я не могу передать результат в функции, ожидающие такого типа аргумента.

Как Powershell должен справиться с таким сценарием?

2 ответа2

1

Это на самом деле контролируется форматом файлов. Из справки powershell help about_Format.ps1xml:

Файлы Format.ps1xml в Windows PowerShell определяют отображение объектов по умолчанию в Windows PowerShell. Вы можете создать свои собственные файлы Format.ps1xml, чтобы изменить отображение объектов или определить отображения по умолчанию для новых типов объектов, которые вы создаете в Windows PowerShell.

Когда Windows PowerShell отображает объект, он использует данные в файлах структурированного форматирования для определения отображения объекта по умолчанию. Данные в файлах форматирования определяют, отображается ли объект в таблице или в списке, и определяют, какие свойства отображаются по умолчанию.

Форматирование влияет только на отображение. Это не влияет на то, какие свойства объекта передаются по конвейеру или как они передаются.

Согласно вашему примеру, get-process возвращает System.Diagnostics.Process , который (формат вывода) определяется в 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)
0

Попробуйте что-то вроде этого:

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

Конечный $_ внутри блока кода пропускает объект.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .