PowerShell 类型化变量条件赋值

问题描述 投票:0回答:1

我有这个代码:

$u = "JohnDoe"   # This user is member of 'Domain users' and 'Test group', so memberOf returns only 'Test group'
$g = $null

if ($u)
{
    $g = [array](Get-ADUser -Identity $u -Properties memberOf|select -ExpandProperty memberOf)
}

$g.GetType()

$h = if ($u)
{
    [array](Get-ADUser -Identity $u -Properties memberOf|select -ExpandProperty memberOf)
}
else
{
    $null
}

$h.GetType()

[array]$i = if ($u)
{
    (Get-ADUser -Identity $u -Properties memberOf|select -ExpandProperty memberOf)
}
else
{
    $null
}
$i.GetType()

有人可以解释为什么

$g.GetType()
$i.GetType()
返回这个(如预期):

IsPublic IsSerial Name            BaseType
-------- -------- ----            --------                                                                                                                            
True     True     Object[]        System.Array                                                                                                                        

以及为什么

h.GetType()
,返回这个(绝对不是预期的)

IsPublic IsSerial Name     BaseType                                                                                                                            
-------- -------- ----     --------                                                                                                                            
True     True     String   System.Object

谢谢:)

powershell
1个回答
0
投票

您的第二个

if
相当于:

$h = if ($u)
{
    write-output [array](Get-ADUser -Identity $u -Properties memberOf|select -ExpandProperty memberOf)
  # ^^^^^^^^^^^^
}
else
{
    $null
}

PowerShell 将项目数组一次一个地“流式传输”(有时称为“展开”)到调用范围 - 因为只返回一项,所以结果是将单个

System.String
项目分配给
$h
。如果结果集中有多个项目,PowerShell 会将它们聚合到一个新的数组对象中,并将 that 分配给
$h

这与返回值从函数中流出的方式基本相同:

function x
{
    # "bare" values get returned as-is
    1
}

write-host ((x).GetType())
# System.Int32

function y
{
    # single-item arrays get unrolled and the
    # first item returned instead of the array
    @( 1 )
}

write-host ((y).GetType())
System.Int32

您的

if
相当于:

function z
{
    # multiple-item arrays also get unrolled, but they
    # get combined into a *new* array at the receiver
    @( 1, 2 )
}

write-host ((z).GetType())
System.Object[]

如果检查解析器生成的 AST,您还可以看到差异:

{
  if ($u)
  {
    $g = [array](Get-ADUser -Identity $u -Properties memberOf|select -ExpandProperty memberOf)
  }
}.Ast.EndBlock.Statements[0].Clauses[2].Item2.Statements[0].GetType().FullName
# System.Management.Automation.Language.AssignmentStatementAst

$g = [array]( ... )
System.Management.Automation.Language.AssignmentStatementAst

{
  $h = if ($u) {
    [array](Get-ADUser -Identity $u -Properties memberOf|select -ExpandProperty memberOf)
  } }.Ast.EndBlock.Statements[0].Right.Clauses[0].Item2.Statements[0].GetType().FullName
# System.Management.Automation.Language.PipelineAst

[array]( ... )
 System.Management.Automation.Language.PipelineAst

© www.soinside.com 2019 - 2024. All rights reserved.