web-dev-qa-db-fra.com

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

Quelle est la différence entre les variables $a et $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.

67
jrara

Tout d'abord, il vous manque des parenthèses pour appeler GetType. Ce que vous voyez est le MethodInfo décrivant la méthode GetType sur [DayOfWeek]. Pour appeler réellement GetType, vous devriez faire:

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

Vous devriez voir que $a est un [DayOfWeek] et $b est un objet personnalisé généré par la cmdlet Select-Object pour capturer uniquement la propriété DayOfWeek d'un objet de données. Par conséquent, c'est un objet avec une propriété DayOfWeek uniquement:

C:\> $b.DayOfWeek -eq $a
True
117
Cédric Rup

Select-Object crée un nouveau psobject et y 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
17
Shay Levy

Select-Object renvoie un paramètre personnalisé PSObject 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.

Au lieu de cela, 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).FullPath_ fonctionne comme prévu et renvoie un tableau contenant uniquement les chemins d'accès complets.

8