GetType używany w PowerShell, różnica między zmiennymi

89

Jaka jest różnica między zmiennymi $aa $b?

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

Próbowałem to sprawdzić

$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

Ale wydaje się, że nie ma różnicy, chociaż dane wyjściowe tych zmiennych wyglądają inaczej.

jrara
źródło

Odpowiedzi:

158

Przede wszystkim brakuje nawiasów do wywołania GetType. To, co widzisz, to MethodInfo opisujące metodę GetType w [DayOfWeek]. Aby faktycznie wywołać GetType, powinieneś zrobić:

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

Powinieneś zobaczyć, że $ajest to [DayOfWeek] i $bjest to niestandardowy obiekt wygenerowany przez polecenie cmdlet Select-Object w celu przechwycenia tylko właściwości DayOfWeek obiektu danych. W związku z tym jest to obiekt z tylko właściwością DayOfWeek:

C:\> $b.DayOfWeek -eq $a
True
Cédric Rup
źródło
20

Select-Object tworzy nowy psobject i kopiuje do niego żądane właściwości. Możesz to zweryfikować za pomocą GetType ():

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

PS > $b.GetType().fullname
System.Management.Automation.PSCustomObject
Shay Levy
źródło
10

Select-Object zwraca niestandardowy obiekt PSObject z określonymi właściwościami. Nawet z jedną właściwością nie otrzymasz zmiennej ACTUAL; jest umieszczony wewnątrz PSObject.

Zamiast tego zrób:

Get-Date | Select-Object -ExpandProperty DayOfWeek

To da taki sam wynik, jak:

(Get-Date).DayOfWeek

Różnica polega na tym, że jeśli Get-Date zwraca wiele obiektów, sposób potoku działa lepiej niż sposób nawiasów (Get-ChildItem), na przykład tablica elementów. Zmieniło się to w programie PowerShell v3 i (Get-ChildItem).FullPathdziała zgodnie z oczekiwaniami i zwraca tablicę tylko pełnych ścieżek.

MasterCheffinator
źródło