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的最大好处是你直接使用对象而不是文本投影,不幸的是,我从来不知道我正在使用什么样的对象 - 即使我检查它,它似乎也没有保持其形状更多而不是几行代码。
- 编辑 该函数作为PSObject
的一部分调用$get_aliases = { ... }
$obj | Add-Member -MemberType ScriptProperty -Name Aliases -Value $get_aliases -SecondValue $set_aliases
答案 0 :(得分:6)
部分问题是如何在函数内部使用数组。请记住,PowerShell中的函数实际上并不返回任何内容。它将对象写入管道。因此,回报是多余的,但实际上并没有造成任何问题。 Add
函数的使用导致了问题,因为Add
returns添加了值的索引,因此也写入了管道。
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'是错误的。
就展开而言,这值得另外一个问题,并且一直是already addressed。
答案 1 :(得分:0)
你如何归还$aliases
?
$a = MyFunctionName # In this way `$a` is of type [OBJECT[]]
您可以尝试这种方式:
[System.Collections.ArrayList]$a = MyFunctionName
以这种方式知道类型之后:
$a.item(0).gettype()