Подтвердить что ты не робот

GetType, используемый в PowerShell, разница между переменными

В чем разница между переменными $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

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

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

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

Ответ 3

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

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

Get-Date | Select-Object -ExpandProperty DayOfWeek

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

(Get-Date).DayOfWeek

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