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の大きな利点は、テキストの投影ではなくオブジェクトを直接操作できることです。残念ながら、どのような種類のオブジェクトを操作しているかはわかりません。確認しても、その形状が維持されていないようです。数行のコードより。

--編集関数は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     

Addサイズが8であることに注意してください。実行する必要があるのは、関数によって返されるものの書き込みを抑制することです。これを行うにはいくつかの方法がありますが、ここに1つあります。

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 に答える