2011-10-03 6 views
44

¿Cuál es la diferencia entre las variables $a y $b?GetType utilizado en PowerShell, diferencia entre las variables

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

Me trataron de comprobar

$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 

Pero no parece haber ninguna diferencia a pesar de la salida de estas variables se ve diferente.

Respuesta

87

Antes que nada, no tiene paréntesis para llamar a GetType. Lo que ves es MethodInfo que describe el método GetType en [DayOfWeek]. Para llamar realidad GetType, que debe hacer:

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

debería ver que es un $a [DayOfWeek], y $b es un objeto personalizado generado por el Select-Object cmdlet para capturar sólo la propiedad DayOfWeek de un objeto de datos. Por lo tanto, es un objeto con sólo una propiedad DayOfWeek:

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

Select-Object crea un nuevo psobject y copia las propiedades que le solicitó. Puede verificar esto con GetType():

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

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

Select-Object vuelve una costumbre PSObject con sólo las propiedades especificadas. Incluso con una sola propiedad, no obtienes la variable ACTUAL; está envuelto dentro del PSObject.

En su lugar, hacer:

Get-Date | Select-Object -ExpandProperty DayOfWeek 

que le dará el mismo resultado que:

(Get-Date).DayOfWeek 

La diferencia es que si Get-Date devuelve varios objetos, la forma en la tubería funciona mejor que el camino entre paréntesis como (Get-ChildItem), por ejemplo, es una matriz de elementos. Esto ha cambiado en PowerShell v3 y (Get-ChildItem).FullPath funciona como se esperaba y devuelve una matriz de solo las rutas completas.

Cuestiones relacionadas