gpt4 book ai didi

powershell - ArrayList 展开

转载 作者:行者123 更新时间:2023-12-04 07:56:27 24 4
gpt4 key购买 nike

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

最佳答案

部分问题在于如何在函数内部使用数组。请记住,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 .

关于powershell - ArrayList 展开,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12916840/

24 4 0