ArrayList展开

bob*_*bob 8 powershell

Powershell展开让我发疯.

我有以下代码从交换收件人检索电子邮件地址.我正在使用ArrayList,因为当你想要从数组中删除项目时,很多人都建议使用它.

$aliases = New-Object System.Collections.ArrayList
$smtpAddresses = (Get-Recipient $this.DN).EmailAddresses | ?{$_.Prefix.ToString() -eq 'smtp' } 
    foreach ($smtpAddress in $smtpAddresses) {
        $aliases.Add($smtpAddress.SmtpAddress)
    }
return $aliases
Run Code Online (Sandbox Code Playgroud)

$ aliases的值在函数末尾是正确的(即将包含x个电子邮件地址并且类型为ArrayList)但在返回后它变为System.Object []并且具有2x个条目.有x Int32后跟x字符串(即{0,1,bob @ here,bob @ there}).为什么会发生这种情况以及如何保持ArrayList完好无损?我使用ArrayList错了吗?

出于好奇,由于PS展开导致的所有问题/问题,它的目的是什么?PowerShell的最大好处是你直接使用对象而不是文本投影,不幸的是,我从来不知道我正在使用什么样的对象 - 甚至当我检查时,它似乎没有保持其形状更多比几行代码.

- 编辑该函数作为PSObject的一部分调用

$get_aliases = { ... }
$obj | Add-Member -MemberType ScriptProperty -Name Aliases -Value $get_aliases -SecondValue $set_aliases
Run Code Online (Sandbox Code Playgroud)

Sco*_*aad 7

部分问题是如何在函数内部使用数组.请记住,PowerShell中的函数实际上并不返回任何内容.它将对象写入管道.因此,回报是多余的,但实际上并没有造成任何问题.Add函数的使用导致问题,因为Add 返回添加值的索引,因此也写入管道.

function get-myarray
{ 
   $al = New-Object System.Collections.ArrayList
   $al.Add( 0 ) 
   $al.Add( 1 )
   $al.Add( 'me@co.com' )
   $al.Add( 'you.co.com' )
   return $al 
}

$array = get-myarray
$array.Count
8     
Run Code Online (Sandbox Code Playgroud)

请注意大小是多少8.需要做的是禁止写入Add函数返回的内容.有几种方法可以做到这一点,但这里有一个:

function get-myarray
{ 
   $al = New-Object System.Collections.ArrayList
   $al.Add( 0 ) | out-null
   $al.Add( 1 )  | out-null
   $al.Add( 'me@co.com' )  | out-null
   $al.Add( 'you.co.com' )  | out-null
   return $al 
}

$array = get-myarray
$array.Count
4 
Run Code Online (Sandbox Code Playgroud)

如果你想从中删除项目,我不相信使用`ArrayList'是错误的.

展开而言,这值得提出另一个问题并且已经解决了.