PowerShell中使用的GetType,变量之间的差异

时间:2011-10-03 11:47:41

标签: powershell powershell-v2.0

变量$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 个答案:

答案 0 :(得分:115)

首先,您缺少调用GetType的括号。你看到的是描述[DayOfWeek]上的GetType方法的MethodInfo。要实际调用GetType,您应该执行以下操作:

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

您应该看到$a是[DayOfWeek],而$bSelect-Object cmdlet生成的自定义对象,只捕获数据对象的DayOfWeek属性。因此,它只是一个具有DayOfWeek属性的对象:

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

答案 1 :(得分:15)

Select-Object创建一个新的psobject并将您请求的属性复制到它。您可以使用GetType()验证这一点:

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

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

答案 2 :(得分:8)

Select-Object只返回指定属性的自定义PSObject。即使使用单一属性,也不会获得ACTUAL变量;它被包装在PSObject中。

相反,请执行:

Get-Date | Select-Object -ExpandProperty DayOfWeek

这会得到与以下结果相同的结果:

(Get-Date).DayOfWeek

不同之处在于,如果Get-Date返回多个对象,则管道方式比(Get-ChildItem)的括号方式更好,例如,是一个项目数组。这在PowerShell v3中已更改,(Get-ChildItem).FullPath按预期工作,并返回仅包含完整路径的数组。