GetType usado no PowerShell, diferença entre variáveis

92

Qual é a diferença entre variáveis $ae $b?

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

Tentei verificar

$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

Mas parece não haver diferença, embora a saída dessas variáveis ​​pareça diferente.

Jrara
fonte

Respostas:

163

Em primeiro lugar, faltam parênteses para chamar GetType. O que você vê é o MethodInfo descrevendo o método GetType em [DayOfWeek]. Para realmente chamar GetType, você deve fazer:

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

Você deve ver que $aé um [DayOfWeek] e $bé um objeto personalizado gerado pelo cmdlet Select-Object para capturar apenas a propriedade DayOfWeek de um objeto de dados. Portanto, é um objeto apenas com uma propriedade DayOfWeek:

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

Select-Object cria um novo psobject e copia as propriedades solicitadas para ele. Você pode verificar isso com GetType ():

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

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

Select-Object retorna um PSObject personalizado apenas com as propriedades especificadas. Mesmo com uma única propriedade, você não obtém a variável ACTUAL; ele é encapsulado dentro do PSObject.

Em vez disso, faça:

Get-Date | Select-Object -ExpandProperty DayOfWeek

Isso obterá o mesmo resultado que:

(Get-Date).DayOfWeek

A diferença é que se Get-Date retornar vários objetos, a forma do pipeline funciona melhor do que a forma entre parênteses (Get-ChildItem), pois , por exemplo, é uma matriz de itens. Isso mudou no PowerShell v3 e (Get-ChildItem).FullPathfunciona conforme o esperado e retorna uma matriz apenas com os caminhos completos.

MasterCheffinator
fonte