2012-10-16 15 views
8

Lo srotolamento del powershell mi sta facendo impazzire.ArrayList Srotolare

Ho il seguente codice per recuperare indirizzi e-mail da un destinatario di Exchange. Sto usando ArrayList perché è suggerito da molte persone quando vuoi la possibilità di rimuovere elementi dall'array.

$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 

Il valore di $ alias è corretta, alla fine della funzione (cioè conterrà indirizzi e-mail X ed è di tipo ArrayList), ma dopo il ritorno diventa System.Object [] e ha 2x voci. C'è x Int32 seguito da x Strings (cioè {0, 1, bob @ qui, bob @ there}). Perché questo accade e come mantenere intatto il mio ArrayList? Ho sbagliato ad usare ArrayList?

Per curiosità, con tutte le domande/problemi derivanti dalla PS srotolamento, qual è il suo scopo? Il grande vantaggio di PowerShell è che lavori direttamente con gli oggetti invece delle loro proiezioni testuali, sfortunatamente, non so mai con che tipo di oggetto sto lavorando - e anche quando controllo, non sembra mantenere la sua forma per più di poche righe di codice.

- Modifica la funzione viene richiamata come parte di un PSObject

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

risposta

6

Una parte del problema è come l'array è in uso all'interno della funzione. Ricorda, una funzione in PowerShell non in realtà restituisce nulla. Scrive oggetti sulla pipeline. Pertanto, il reso è superfluo, ma in realtà non causa alcun problema. L'utilizzo della funzione Add causa il problema perché Addreturns l'indice a cui è stato aggiunto il valore e pertanto scrive anche sulla pipeline.

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  

Si noti come la dimensione è 8. Che cosa deve essere fatto è quello di sopprimere la scrittura di ciò che viene restituito dalla funzione Add. Ci sono alcuni modi per fare questo, ma qui è uno:

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 

non credo l'uso di `ArrayList' è un male se si desidera rimuovere gli elementi da esso.

Per quanto riguarda lo srotolamento, questo merita un'intera altra domanda ed è stato already addressed.

+0

@bob Felice di sentirlo. Continua così con le tue esplorazioni! Ci vuole un po 'di tempo per trasformare la mente in lavoro in modalità * pipeline *. Quando ciò accade, inizierai ad apprezzare ciò che PowerShell sta facendo per te. –

0

Come restituire il $aliases?

come questo?

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

Si può provare in questo modo:

[System.Collections.ArrayList]$a = MyFunctionName 

dopo si può conoscere il tipo in questo modo:

$a.item(0).gettype()