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.

jrara
la source

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
Cédric Rup
la source
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
Shay Levy
la source
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.

MaîtreCheffinateur
la source