wake-up-neo.com

In PowerShell verwendeter GetType, Unterschied zwischen Variablen

Was ist der Unterschied zwischen Variablen $a und $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 unterschiedlich aussieht.

67
jrara

Zunächst fehlen 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 $a Ein [DayOfWeek] und $b Ein benutzerdefiniertes Objekt ist, das vom Cmdlet Select-Object generiert wird, um nur die DayOfWeek-Eigenschaft von Daten zu erfassen Objekt. Daher ist es nur ein Objekt mit einer DayOfWeek-Eigenschaft:

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

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

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

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

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

Tun Sie stattdessen Folgendes:

Get-Date | Select-Object -ExpandProperty DayOfWeek

So 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 Methode in Klammern, da (Get-ChildItem) beispielsweise ein Array von ist Artikel. Dies hat sich in PowerShell v3 geändert und (Get-ChildItem).FullPath Funktioniert wie erwartet und gibt nur ein Array mit den vollständigen Pfaden zurück.

8