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
Но, похоже, нет никакой разницы, хотя вывод этих переменных выглядит иначе.
Ответы
Ответ 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
работает так, как ожидалось, и возвращает массив только полных путей.