Несколько общих замечаний.
$obj | Select-Object
⊆ $obj | Select-Object -Property *
Последний покажет все не внутренние, не созданные компилятором свойства. Первый, похоже, не (всегда) показывает все типы свойств (в моих тестах он, похоже, показывает CodeProperty
MemberType
последовательно - здесь нет никаких гарантий).
Некоторые переключатели, о которых следует знать для Get-Member
Get-Member
никак не получить статические члены по умолчанию. Вы также не можете (напрямую) получить их вместе с нестатическими членами. То есть использование переключателя приводит к возврату только статических членов:
PS Y:\Power> $obj | Get-Member -Static
TypeName: System.IsFire.TurnUpProtocol
Name MemberType Definition
---- ---------- ----------
Equals Method static bool Equals(System.Object objA, System.Object objB)
...
Используйте расширение -Force
.
Команда Get-Member
использует параметр Force для добавления внутренних членов и созданных компилятором членов объектов к отображению. Get-Member
получает эти члены, но по умолчанию скрывает их.
PS Y:\Power> $obj | Get-Member -Static
TypeName: System.IsFire.TurnUpProtocol
Name MemberType Definition
---- ---------- ----------
...
pstypenames CodeProperty System.Collections.ObjectModel.Collection...
psadapted MemberSet psadapted {AccessRightType, AccessRuleType,...
...
Используйте ConvertTo-Json
для глубины и удобочитаемой "сериализации"
Я не рекомендую сохранять объекты с помощью JSON (используйте Export-Clixml
вместо этого). Однако вы можете получить более или менее читаемый вывод ConvertTo-Json
, который также позволяет указать глубину.
Обратите внимание, что отсутствие указания Depth
подразумевает-Depth 2
PS Y:\Power> ConvertTo-Json $obj -Depth 1
{
"AllowSystemOverload": true,
"AllowLifeToGetInTheWay": false,
"CantAnyMore": true,
"LastResortOnly": true,
...
И если вы не планируете его читать, вы можете -Compress
это (т.е. убрать пробелы)
PS Y:\Power> ConvertTo-Json $obj -Depth 420 -Compress
Используйте, -InputObject
если можете (и хотите)
В 99,9% случаев при использовании PowerShell: либо производительность не имеет значения, либо вы не заботитесь о производительности. Однако следует отметить, что отказ от канала, когда он вам не нужен, может сэкономить некоторые накладные расходы и добавить некоторую скорость (трубопровод, как правило, не сверхэффективен).
То есть, если у вас есть все, что у вас есть, это единственный $obj
удобный для печати (и не слишком ленив, как я иногда, чтобы печатать -InputObject
):
# select is aliased (hardcoded) to Select-Object
PS Y:\Power> select -Property * -InputObject $obj
# gm is aliased (hardcoded) to Get-Member
PS Y:\Power> gm -Force -InputObject $obj
Предостережение Get-Member -InputObject
:
если $ obj является коллекцией (например System.Object[]
), вы получите информацию о самом объекте коллекции:
PS Y:\Power> gm -InputObject $obj,$obj2
TypeName: System.Object[]
Name MemberType Definition
---- ---------- ----------
Count AliasProperty Count = Length
...
Если вы хотите Get-Member
для каждого TypeName
в коллекции (NB для каждого TypeName
, а не для каждого объекта - набор из N объектов со всеми одинаковыми TypeName
будет печатать только 1 таблицу для этого TypeName
, а не N таблиц для каждого объекта) ...... просто вставьте его напрямую.
-Force
параметр, чтобы он работал, напримерWrite-Host ($obj | Format-List -Force | Out-String)