PowerShell中使用的GetType,变量之间的区别


89

$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

但是,尽管这些变量的输出看起来不同,但似乎没有什么区别。

Answers:


158

首先,您没有括号来调用GetType。您将看到在[DayOfWeek]上描述GetType方法的MethodInfo。要实际调用GetType,您应该执行以下操作:

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

您应该看到它$a是[DayOfWeek],并且$b是由Select-Object cmdlet生成的自定义对象,用于仅捕获数据对象的DayOfWeek属性。因此,它是一个仅具有DayOfWeek属性的对象:

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

20

选择对象将创建一个新的psobject并将您请求的属性复制到该对象。您可以使用GetType()进行验证:

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

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

10

Select-Object返回带有指定属性的自定义PSObject。即使只有一个属性,您也不会获得ACTUAL变量。它包装在PSObject内。

相反,请执行以下操作:

Get-Date | Select-Object -ExpandProperty DayOfWeek

那将获得与以下相同的结果:

(Get-Date).DayOfWeek

区别在于,如果Get-Date返回多个对象,则流水线方法比括号中的方法效果更好(Get-ChildItem),例如,它是一个由项组成的数组。这在PowerShell v3中已更改,(Get-ChildItem).FullPath可以按预期工作,并且仅返回完整路径的数组。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.