Quelques remarques générales.
$obj | Select-Object
⊆ $obj | Select-Object -Property *
Ce dernier affichera toutes les propriétés non intrinsèques et non générées par le compilateur. Le premier ne pas semble (toujours) montrer tous les types de propriété (dans mes tests, il ne semble montrer la CodeProperty
MemberType
constante bien - aucune garantie ici).
Quelques commutateurs à connaître pour Get-Member
Get-Member
n'obtient pas de membres statiques par défaut. Vous ne pouvez pas non plus (directement) les obtenir avec les membres non statiques. Autrement dit, l'utilisation du commutateur entraîne uniquement le retour des membres statiques:
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)
...
Utilisez le -Force
.
La Get-Member
commande utilise le paramètre Force pour ajouter les membres intrinsèques et les membres générés par le compilateur des objets à l'affichage. Get-Member
obtient ces membres, mais il les masque par défaut.
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,...
...
Utilisation ConvertTo-Json
pour une "sérialisation" détaillée et lisible
Je ne recommande pas nécessairement d'enregistrer des objets en utilisant JSON (à utiliser à la Export-Clixml
place). Cependant, vous pouvez obtenir une sortie plus ou moins lisible deConvertTo-Json
, ce qui vous permet également de spécifier la profondeur.
Notez que ne pas spécifier Depth
implique-Depth 2
PS Y:\Power> ConvertTo-Json $obj -Depth 1
{
"AllowSystemOverload": true,
"AllowLifeToGetInTheWay": false,
"CantAnyMore": true,
"LastResortOnly": true,
...
Et si vous ne prévoyez pas de le lire, vous pouvez le -Compress
faire (c'est-à-dire supprimer les espaces)
PS Y:\Power> ConvertTo-Json $obj -Depth 420 -Compress
Utilisation -InputObject
si vous pouvez (et êtes prêt)
99,9% du temps lors de l'utilisation de PowerShell: soit les performances n'ont pas d'importance, soit vous ne vous souciez pas des performances. toutefois , il convient de noter qu'éviter le tuyau lorsque vous n'en avez pas besoin peut économiser des frais généraux et ajouter de la vitesse (la tuyauterie, en général, n'est pas super efficace).
Autrement dit, si vous n'avez qu'un seul $obj
outil pratique pour l'impression (et que vous n'êtes pas trop paresseux comme moi parfois pour taper -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
Avertissement pour Get-Member -InputObject
:
Si $ obj est une collection (par exemple System.Object[]
), vous finissez par obtenir des informations sur l'objet de collection lui-même:
PS Y:\Power> gm -InputObject $obj,$obj2
TypeName: System.Object[]
Name MemberType Definition
---- ---------- ----------
Count AliasProperty Count = Length
...
Si vous voulez Get-Member
pour chacun TypeName
dans la collection (NB pour chacun TypeName
, pas pour chaque objet - une collection de N objets avec tous les mêmes TypeName
n'imprimera qu'une table pour cela TypeName
, pas N tables pour chaque objet) ...... il suffit de le coller directement.
-Force
paramètre pour le faire fonctionner, par exempleWrite-Host ($obj | Format-List -Force | Out-String)