Если я напишу эту маленькую функцию:
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 должен справиться с таким сценарием?