2012-10-16 27 views
8

Powershell açma işlemi beni deli ediyor.ArrayList Kaydı

Ben bir değişim alıcısına e-posta adreslerini almak için aşağıdaki kodu var. ArrayList kullanıyorum çünkü birçok kişi tarafından önerildiğinden, diziden öğeleri kaldırabiliyorsunuz.

$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 

takma işlevi sonunda doğru $ değeri (yani X-posta adreslerini içeren ve tip ArrayList) ama döndükten sonra bu System.Object [] olur ve 2x girişi bulunmaktadır. Orada x Int32'ler ve ardından x Strings (yani {0, 1, bob @ here, bob @ there}). Bu neden oluyor ve ArrayList'imi nasıl koruyabilirim? ArrayList kullanmak için yanlış mıyım? Meraktan

tüm sorular/sorunlar PS unrolling kaynaklanan ile, amacı nedir? Powershell'in büyük yararı, metinsel projeksiyonları yerine doğrudan nesnelerle çalışmanızdır, ne yazık ki, ne tür bir nesne ile çalıştığımı asla bilmem - ve hatta kontrol ettiğimde bile, şeklini daha fazla tutmuyor gibi görünüyor. birkaç satırdan daha fazla.

- Nasıl $aliases iade edilir düzenleme işlevi PSObject

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

cevap

6

Sorunun bir kısmı dizisi içine nasıl kullanıldığını ise işlevi. Unutmayın, PowerShell'deki bir işlev aslında hiçbir şey döndürmez. Nesneleri boru hattına yazar. Bu nedenle, geri dönüş gereksizdir, ancak aslında herhangi bir soruna neden olmaz. Add işlevinin kullanılması soruna neden oluyor çünkü Addreturns değerinin eklendiği endeks ve bu nedenle de boru hattına da yazıyor. boyut yapılması gereken nedir 8. nasıl

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  

Not Add işlevi tarafından döndürülen ne yazımı bastırmaktır. Bunu yapmanın birkaç yolu vardır ama burada biridir: Eğer ondan öğeleri kaldırmak istiyorsanız

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 

ben `ArrayList' kullanımını inanmıyorum yanlış biridir.

kayıtlarına girer girmez, bu başka bir soruyu hak eder ve already addressed olmuştur.

+0

@bob Bunu duyduğuma sevindim. Keşiflerinle devam et! Zihni * boru hattı * modunda çalışmaya zorlamak biraz zaman alır. Bu, PowerShell'in sizin için neler yaptığını takdir etmeye başladığınıza karar verir. –

0

parçası olarak adlandırılır?

bunu beğendiniz mi?

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

Bu şekilde deneyebilirsiniz: Bu şekilde türünü bilemez sonra

[System.Collections.ArrayList]$a = MyFunctionName 

:

$a.item(0).gettype()