8

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

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

出于好奇,由于 PS 展开导致的所有问题/问题,它的目的是什么?powershell 的最大好处是你可以直接使用对象而不是它们的文本投影,不幸的是,我永远不知道我正在使用什么样的对象 - 即使当我检查时,它似乎也无法保持其形状更多而不是几行代码。

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

$get_aliases = { ... }
$obj | Add-Member -MemberType ScriptProperty -Name Aliases -Value $get_aliases -SecondValue $set_aliases
4

2 回答 2

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     

注意大小是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 

如果您想从中删除项目,我不相信使用“ArrayList”是错误的。

展开而言,这值得另一个问题,并且已经得到解决

于 2012-10-16T15:01:12.927 回答
0

你是怎么退货的$aliases

像这样?

$a = MyFunctionName # In this way `$a` is of type [OBJECT[]]

你可以这样试试:

[System.Collections.ArrayList]$a = MyFunctionName

在您可以通过这种方式知道类型之后:

$a.item(0).gettype()
于 2012-10-16T14:38:47.527 回答