GetType используется в PowerShell, разница между переменными - PullRequest
66 голосов
/ 03 октября 2011

В чем разница между переменными $a и $b?

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

Я пытался проверить

$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

Но, похоже, нет никакой разницы, хотя выходные данные этих переменных выглядят по-разному.

Ответы [ 3 ]

116 голосов
/ 03 октября 2011

Прежде всего, вам не хватает скобок для вызова GetType. То, что вы видите, это MethodInfo, описывающее метод GetType в [DayOfWeek]. Чтобы действительно вызвать GetType, вы должны сделать:

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

Вы должны увидеть, что $a - это [DayOfWeek], а $b - это пользовательский объект, созданный командлетом Select-Object для захвата только свойства DayOfWeek объекта данных. Следовательно, это объект только со свойством DayOfWeek:

C:\> $b.DayOfWeek -eq $a
True
15 голосов
/ 03 октября 2011

Select-Object создает новый объект psobject и копирует запрошенные вами свойства. Вы можете проверить это с помощью GetType ():

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

PS > $b.GetType().fullname
System.Management.Automation.PSCustomObject
8 голосов
/ 10 мая 2013

Select-Object возвращает пользовательский PSObject только с указанными свойствами. Даже с одним свойством вы не получите переменную ACTUAL; он обернут внутри объекта PSObject.

Вместо этого выполните:

Get-Date | Select-Object -ExpandProperty DayOfWeek

Это даст вам тот же результат, что и:

(Get-Date).DayOfWeek

Разница в том, что если Get-Date возвращает несколько объектов, конвейерный путь работает лучше, чем в скобках, например, (Get-ChildItem) - это массив элементов. В PowerShell v3 это изменилось, и (Get-ChildItem).FullPath работает как положено и возвращает массив только полных путей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...