在PowerShell中使用的GetType,variables之间的区别

variables$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 

但是,尽pipe这些variables的输出看起来不同,但似乎没有区别。

首先,你缺less调用GetType的圆括号。 你所看到的是描述[DayOfWeek]上的GetType方法的MethodInfo。 要真正调用GetType,你应该这样做:

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

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

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

select对象创build一个新的psobject并复制你请求的属性。 你可以使用GetType()来validation它:

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

Select-Object只返回一个具有指定属性的自定义PSObject 。 即使有一个属性,你也不会得到ACTUALvariables; 它被包裹在PSObject内部。

相反,做:

 Get-Date | Select-Object -ExpandProperty DayOfWeek 

那会得到和你一样的结果:

 (Get-Date).DayOfWeek 

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