2012-10-16 3 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 []지고 배 항목이있다. 거기에 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에 '의 사용을 생각하지 않는다는 잘못된 것입니다.

까지 펼치기은 다른 질문을 할만한 가치가 있으며 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()