GetType usado en PowerShell, diferencia entre variables

89

¿Cuál es la diferencia entre variables $ay $b?

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

Traté 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 parece no haber diferencia, aunque la salida de estas variables parece diferente.

jrara
fuente

Respuestas:

158

En primer lugar, le faltan paréntesis para llamar a GetType. Lo que ve es MethodInfo que describe el método GetType en [DayOfWeek]. Para llamar a GetType, debe hacer lo siguiente:

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

Debería ver que $aes un [DayOfWeek] y $bes un objeto personalizado generado por el cmdlet Select-Object para capturar solo la propiedad DayOfWeek de un objeto de datos. Por lo tanto, es un objeto con una propiedad DayOfWeek únicamente:

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

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
Shay Levy
fuente
10

Select-Object devuelve un PSObject personalizado con solo las propiedades especificadas. Incluso con una sola propiedad, no obtiene la variable ACTUAL; está envuelto dentro del PSObject.

En su lugar, haz lo siguiente:

Get-Date | Select-Object -ExpandProperty DayOfWeek

Eso le dará el mismo resultado que:

(Get-Date).DayOfWeek

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

MasterCheffinator
fuente