变量$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
但是,尽管这些变量的输出看起来不同,但似乎没有区别。
答案 0 :(得分:115)
首先,您缺少调用GetType的括号。你看到的是描述[DayOfWeek]上的GetType方法的MethodInfo。要实际调用GetType,您应该执行以下操作:
$a.GetType();
$b.GetType();
您应该看到$a
是[DayOfWeek],而$b
是Select-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
按预期工作,并返回仅包含完整路径的数组。