GetType utilisé dans PowerShell, différence entre les variables


89

Quelle est la différence entre les variables $aet $b?

$a = (Get-Date).DayOfWeek
$b = Get-Date | Select-Object DayOfWeek

J'ai essayé de vérifier

$a.GetType
$b.GetType

MemberType          : Method
OverloadDefinitions : {type GetType()}
TypeNameOfValue     : System.Management.Automation.PSMethod
Value               : type GetType()
Name                : GetType
IsInstance          : True

MemberType          : Method
OverloadDefinitions : {type GetType()}
TypeNameOfValue     : System.Management.Automation.PSMethod
Value               : type GetType()
Name                : GetType
IsInstance          : True

Mais il ne semble y avoir aucune différence bien que la sortie de ces variables semble différente.

Réponses:


158

Tout d'abord, vous n'avez pas de parenthèses pour appeler GetType. Ce que vous voyez est le MethodInfo décrivant la méthode GetType sur [DayOfWeek]. Pour appeler GetType, vous devez faire:

$a.GetType();
$b.GetType();

Vous devriez voir qu'il $as'agit d'un [DayOfWeek] et d' $bun objet personnalisé généré par l' applet de commande Select-Object pour capturer uniquement la propriété DayOfWeek d'un objet de données. Par conséquent, il s'agit d'un objet avec une propriété DayOfWeek uniquement:

C:\> $b.DayOfWeek -eq $a
True

20

Select-Object crée un nouveau psobject et lui copie les propriétés que vous avez demandées. Vous pouvez le vérifier avec GetType ():

PS > $a.GetType().fullname
System.DayOfWeek

PS > $b.GetType().fullname
System.Management.Automation.PSCustomObject

10

Select-Object renvoie un PSObject personnalisé avec uniquement les propriétés spécifiées. Même avec une seule propriété, vous n'obtenez pas la variable ACTUAL; il est enveloppé dans le PSObject.

À la place, faites:

Get-Date | Select-Object -ExpandProperty DayOfWeek

Cela vous donnera le même résultat que:

(Get-Date).DayOfWeek

La différence est que si Get-Date renvoie plusieurs objets, la méthode du pipeline fonctionne mieux que la méthode entre parenthèses car (Get-ChildItem), par exemple, est un tableau d'éléments. Cela a changé dans PowerShell v3 et (Get-ChildItem).FullPathfonctionne comme prévu et renvoie un tableau contenant uniquement les chemins complets.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.