2012-10-16 31 views
8

Việc ngừng hoạt động của Powershell khiến tôi phát điên.ArrayList Unrolling

Tôi có mã sau để truy xuất địa chỉ email từ người nhận trao đổi. Tôi đang sử dụng ArrayList vì nó được đề xuất bởi nhiều người khi bạn muốn khả năng loại bỏ các mục khỏi mảng.

$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 

Giá trị của $ bí danh là đúng ở phần cuối của hàm (ví dụ: sẽ chứa địa chỉ email và x là kiểu ArrayList) nhưng sau khi trở về nó trở nên System.Object [] và có 2x mục. Có x Int32 được theo sau bởi x Strings (tức là {0, 1, bob @ here, bob @ there}). Tại sao điều này xảy ra và làm thế nào để giữ cho ArrayList của tôi còn nguyên vẹn? Tôi có sai khi sử dụng ArrayList không?

Hết sức tò mò, với tất cả các câu hỏi/vấn đề phát sinh từ việc kiểm tra PS, mục đích của nó là gì? Lợi ích lớn của powershell là bạn làm việc trực tiếp với các đối tượng thay vì dự đoán văn bản của họ, thật không may, tôi không bao giờ biết tôi đang làm việc với loại đối tượng nào - và ngay cả khi tôi kiểm tra, nó dường như không giữ được hình dạng của nó hơn một vài dòng mã.

- Chỉnh sửa Các hàm được gọi như là một phần của một PSObject

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

Trả lời

6

Một phần của vấn đề là như thế nào mảng đang được sử dụng bên trong chức năng. Hãy nhớ rằng, một chức năng trong PowerShell không thực sự là trả lại bất kỳ điều gì. Nó viết các đối tượng vào đường ống. Vì vậy, sự trở lại là thừa, nhưng không thực sự gây ra bất kỳ vấn đề. Việc sử dụng hàm Add gây ra sự cố bởi vì Addreturns chỉ mục mà tại đó giá trị được thêm vào và do đó cũng ghi vào đường dẫn.

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  

Lưu ý kích thước bằng cách nào 8. Cần phải làm gì để chặn nội dung được trả về bởi hàm Add. Có một số cách để thực hiện việc này nhưng dưới đây là một cách:

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 

Tôi không tin rằng việc sử dụng 'ArrayList' là sai nếu bạn muốn xóa các mục khỏi nó.

Theo như hủy đăng ký, điều này xứng đáng là một câu hỏi hoàn toàn khác và đã là already addressed.

+0

@bob Rất vui khi biết điều đó. Giữ nó với những khám phá của bạn! Phải mất một chút thời gian để làm cho tâm trí hoạt động trong chế độ * pipeline *. Khi điều đó xảy ra, bạn sẽ bắt đầu đánh giá cao những gì PowerShell đang làm cho bạn. –

0

How are you trả lại $aliases?

như thế này?

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

Bạn có thể thử cách này:

[System.Collections.ArrayList]$a = MyFunctionName 

sau khi bạn có thể biết loại theo cách này:

$a.item(0).gettype()