2012-10-16 5 views
8

Powershellアンロールが私を狂わせてしまいます。ArrayList Unrolling

私は交換者から電子メールアドレスを取得するためのコードを持っています。 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 

エイリアスが関数の最後に正しい$の値(すなわち、Xのメールアドレスが含まれ、型のArrayListである)が、復帰後、それはSystem.Objectの[]になり、2倍のエントリを有します。 x Int32の後ろにx文字列(すなわち、{0,1、bob @ here、bob @ there})が続きます。なぜこれが起こり、ArrayListをそのまま維持するのですか? ArrayListの使用に間違っていますか?

PSのアンローリングに起因するすべての質問/問題があり、その目的は何か? PowerShellの大きな利点は、テキスト投影の代わりにオブジェクトを使って直接作業することです。残念ながら、私がどのようなオブジェクトを扱っているのかわかりません。チェックしても、より多くのいくつかのコード行よりも。

- どのようにあなたが$aliasesを返却している編集 は、関数がPSObject

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

答えて

6

一部は、アレイは、内部で使用されている方法です関数。 PowerShellの関数は実際にはを返さないことを覚えておいてください。オブジェクトをパイプラインに書き込みます。したがって、リターンは余分ですが、実際に問題を引き起こすわけではありません。 Add関数を使用すると、値が追加されたインデックスがパイプラインにも書き込まれるため、Addreturnsのインデックスが原因で問題が発生しています。サイズは何をすべきか8.どのように

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

$array = get-myarray 
$array.Count 
8  

Add関数によって返されるものの書き込みを抑制することです。そこにこれを行うにはいくつかの方法があるが、ここで一つです:

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

$array = get-myarray 
$array.Count 
4 

私はあなたがそれから項目を削除したい場合は、 `ArrayListの「の使用が間違っ1であるとは考えていません。

までは、が公開されていますが、これは他の質問と同様です。already addressedです。

+0

@bob嬉しいです。あなたの探検と一緒にそれを保つ! *パイプラインモードで動作するように心を歪めるには、少し時間がかかります。一度それが考えられたら、PowerShellがあなたのためにやっていることを理解し始めるでしょう。 –

0

の一部として呼ばれているのですか?

このような?

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

あなたはこの方法を試すことができます。

[System.Collections.ArrayList]$a = MyFunctionName 

あなたがこの方法でタイプを知ることができた後:問題の

$a.item(0).gettype()