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