2011-10-03 9 views
44

Jaka jest różnica między zmiennymi $a i $b?GetType używany w PowerShell, różnica między zmiennymi

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

Próbowałem 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, choć wyjście z tych zmiennych wygląda inaczej.

Odpowiedz

87

Po pierwsze brakuje nawiasów, aby wywołać metodę GetType. To, co widzisz, to MethodInfo opisujące metodę GetType w [DayOfWeek]. Faktycznie nazwać GetType, należy zrobić:

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

Należy zauważyć, że $a jest [DzienTygodnia] i $b jest obiekt niestandardowy generowane przez Select-Object cmdletu uchwycić tylko właściwość DAYOFWEEK obiektu danych. Stąd jest to obiekt tylko z własności DAYOFWEEK:

C:\> $b.DayOfWeek -eq $a 
True 
11

Select-Object tworzy nowy psobject i kopiuje właściwości, które do niego zażądałeś. Można to sprawdzić za pomocą metody GetType():

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

PS > $b.GetType().fullname 
System.Management.Automation.PSCustomObject 
6

Select-Object zwraca zwyczaj PSObject tylko z określonymi właściwościami. Nawet z jedną właściwością nie otrzymasz zmiennej ACTUALNEJ; jest zawinięty wewnątrz PSObject.

Zamiast zrobić:

Get-Date | Select-Object -ExpandProperty DayOfWeek 

To będzie Ci taki sam wynik jak:

(Get-Date).DayOfWeek 

Różnica polega na tym, że jeśli Get-Date zwraca wiele obiektów, sposób rurociąg działa lepiej niż w nawiasie drodze jako (Get-ChildItem), na przykład, jest tablicą elementów. To się zmieniło w PowerShell v3 i (Get-ChildItem).FullPath działa zgodnie z oczekiwaniami i zwraca tablicę tylko pełnych ścieżek.