Quelques notes générales.
$obj | Select-Object
$obj | Select-Object -Property *
Ce dernier montrera todo propriétés non intrinsèques, non générées par le compilateur. La première fait no semblent (toujours) montrer todo Les types de propriétés (dans mes tests, il semble bien que l'on affiche les CodeProperty
MemberType
de manière cohérente, mais sans aucune garantie).
Quelques interrupteurs à connaître pour Obtenir l'adhésion
-
Get-Member
hace no obtiennent des membres statiques par défaut. Vous pouvez également ne peut pas (directement) les obtenir ainsi que les membres non statiques. En d'autres termes, l'utilisation du commutateur permet de renvoyer uniquement les 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
.
El Get-Member
utilise l'option 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 cache 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,...
...
Utilisez ConvertTo-Json
pour une "sérialisation" profonde et lisible
Je le fais. no Il est nécessaire de recommander de sauvegarder les objets en utilisant JSON (utiliser Export-Clixml
à la place). Cependant, vous pouvez obtenir une sortie plus ou moins lisible à partir de ConvertTo-Json
qui vous permet également de spécifier la profondeur.
Notez que si vous ne spécifiez pas Depth
implica -Depth 2
PS Y:\Power> ConvertTo-Json $obj -Depth 1
{
"AllowSystemOverload": true,
"AllowLifeToGetInTheWay": false,
"CantAnyMore": true,
"LastResortOnly": true,
...
Et si vous n'avez pas l'intention de le lire, vous pouvez -Compress
(c'est-à-dire en supprimant les espaces blancs)
PS Y:\Power> ConvertTo-Json $obj -Depth 420 -Compress
Utilisez -InputObject
si vous le pouvez (et le voulez)
Dans 99,9 % des cas, lorsqu'on utilise PowerShell, soit les performances n'ont aucune importance, soit elles ne vous intéressent pas. Cependant Il convient de noter qu'en évitant d'utiliser le pipe lorsque vous n'en avez pas besoin, vous pouvez économiser des frais généraux et gagner en rapidité (le pipe, en général, n'est pas très efficace).
C'est-à-dire que si vous n'avez qu'un seul $obj
à portée de main pour l'impression (et ne sont pas trop paresseux comme moi parfois pour taper à la machine) -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 un collection (par exemple System.Object[]
), vous finissez par obtenir des informations sur l'objet de la 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 chaque TypeName
dans la collection (N.B. pour chaque TypeName
, no pour chaque objet une collection de N objets avec tous les mêmes TypeName
n'imprimera qu'un seul tableau pour cette TypeName
et non pas N tables pour chaque objet) ....... Contentez-vous de l'intégrer directement dans la tuyauterie.