Alcune note generali.
$obj | Select-Object
⊆ $obj | Select-Object -Property *
Quest'ultimo mostrerà tutte le proprietà non intrinseche, non generate dal compilatore. Il primo non sembra mostrare (sempre) tutti i tipi di proprietà (nei miei test, sembra mostrare CodeProperty
MemberType
coerentemente però - nessuna garanzia qui).
Alcuni interruttori di cui essere a conoscenza per Get-Member
Get-Member
non non avere membri statici per impostazione predefinita. Inoltre, non è possibile (direttamente) ottenerli insieme ai membri non statici. Ovvero, l'utilizzo dell'opzione causa la restituzione solo dei membri statici:
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)
...
Usa il -Force
.
Il Get-Member
comando utilizza il parametro Force per aggiungere alla visualizzazione i membri intrinseci e i membri degli oggetti generati dal compilatore. Get-Member
ottiene questi membri, ma li nasconde per impostazione predefinita.
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,...
...
Uso ConvertTo-Json
per una "serializzazione" approfondita e leggibile
Non è necessario consigliare di salvare gli oggetti utilizzando JSON (usa Export-Clixml
invece). Tuttavia, è possibile ottenere un output più o meno leggibile da ConvertTo-Json
, che consente anche di specificare la profondità.
Nota che non specificare Depth
implica-Depth 2
PS Y:\Power> ConvertTo-Json $obj -Depth 1
{
"AllowSystemOverload": true,
"AllowLifeToGetInTheWay": false,
"CantAnyMore": true,
"LastResortOnly": true,
...
E se non hai intenzione di leggerlo, puoi -Compress
farlo (cioè togliere gli spazi bianchi)
PS Y:\Power> ConvertTo-Json $obj -Depth 420 -Compress
Usa -InputObject
se puoi (e sei disposto)
Il 99,9% delle volte quando si utilizza PowerShell: o le prestazioni non contano o non ti interessano le prestazioni. Tuttavia , va notato che evitare il tubo quando non è necessario può risparmiare un po 'di overhead e aggiungere un po' di velocità (le tubazioni, in generale, non sono super efficienti).
Cioè, se tutto quello che hai è un unico a $obj
portata di mano per la stampa (e non sei troppo pigro come me a volte per digitare -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
Avvertenza Get-Member -InputObject
:
se $ obj è una raccolta (ad esempio System.Object[]
), si finiscono per ottenere informazioni sull'oggetto della raccolta stesso:
PS Y:\Power> gm -InputObject $obj,$obj2
TypeName: System.Object[]
Name MemberType Definition
---- ---------- ----------
Count AliasProperty Count = Length
...
Se lo desideri Get-Member
per ciascuno TypeName
nella raccolta (NB per ciascuno TypeName
, non per ogni oggetto - una raccolta di N oggetti con lo stesso TypeName
stamperà solo 1 tabella per quello TypeName
, non N tabelle per ogni oggetto) ... basta attaccare con tubazioni direttamente.
-Force
parametro per farlo funzionare, ad esempioWrite-Host ($obj | Format-List -Force | Out-String)