Деякі загальні примітки.
$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)