GetType wird in PowerShell verwendet, Unterschied zwischen Variablen

88

Was ist der Unterschied zwischen Variablen $aund $b?

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

Ich habe versucht zu überprüfen

$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

Es scheint jedoch keinen Unterschied zu geben, obwohl die Ausgabe dieser Variablen anders aussieht.

jrara
quelle

Antworten:

157

Zunächst fehlen Ihnen Klammern, um GetType aufzurufen. Was Sie sehen, ist die MethodInfo, die die GetType-Methode in [DayOfWeek] beschreibt. Um GetType tatsächlich aufzurufen, sollten Sie Folgendes tun:

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

Sie sollten sehen, dass dies $aein [DayOfWeek] ist und $bein benutzerdefiniertes Objekt, das vom Cmdlet Select-Object generiert wird, um nur die DayOfWeek-Eigenschaft eines Datenobjekts zu erfassen. Daher ist es nur ein Objekt mit einer DayOfWeek-Eigenschaft:

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

Select-Object erstellt ein neues psobject und kopiert die von Ihnen angeforderten Eigenschaften darauf. Sie können dies mit GetType () überprüfen:

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

PS > $b.GetType().fullname
System.Management.Automation.PSCustomObject
Shay Levy
quelle
10

Select-Object gibt ein benutzerdefiniertes PSObject mit nur den angegebenen Eigenschaften zurück. Selbst mit einer einzelnen Eigenschaft erhalten Sie die Variable ACTUAL nicht. Es ist im PSObject verpackt.

Tun Sie stattdessen:

Get-Date | Select-Object -ExpandProperty DayOfWeek

Damit erhalten Sie das gleiche Ergebnis wie:

(Get-Date).DayOfWeek

Der Unterschied besteht darin, dass, wenn Get-Date mehrere Objekte zurückgibt, die Pipeline-Methode besser funktioniert als die in Klammern gesetzte Methode, da es sich (Get-ChildItem)beispielsweise um ein Array von Elementen handelt. Dies hat sich in PowerShell v3 geändert und (Get-ChildItem).FullPathfunktioniert wie erwartet. Es wird nur ein Array mit den vollständigen Pfaden zurückgegeben.

MasterCheffinator
quelle