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

jra*_*ara 71 powershell powershell-2.0

什么是变量之间的差异$a$b

$a = (Get-Date).DayOfWeek
$b = Get-Date | Select-Object DayOfWeek
Run Code Online (Sandbox Code Playgroud)

我试着检查一下

$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
Run Code Online (Sandbox Code Playgroud)

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

Céd*_*Rup 124

首先,你没有括号来调用GetType.你看到的是描述[DayOfWeek]上的GetType方法的MethodInfo.要实际调用GetType,您应该:

$a.GetType();
$b.GetType();
Run Code Online (Sandbox Code Playgroud)

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

C:\> $b.DayOfWeek -eq $a
True
Run Code Online (Sandbox Code Playgroud)


Sha*_*evy 17

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

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

PS > $b.GetType().fullname
System.Management.Automation.PSCustomObject
Run Code Online (Sandbox Code Playgroud)


小智 9

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

相反,做:

Get-Date | Select-Object -ExpandProperty DayOfWeek
Run Code Online (Sandbox Code Playgroud)

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

(Get-Date).DayOfWeek
Run Code Online (Sandbox Code Playgroud)

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