2009-03-06 4 views
13

Tôi đã có danh sách các tệp trong một mảng. Tôi muốn liệt kê các tệp đó và xóa các tệp cụ thể khỏi tệp đó. Rõ ràng là tôi không thể xóa các mục khỏi một mảng, vì vậy tôi muốn sử dụng một ArrayList. Nhưng sau không làm việc cho tôi:Làm thế nào để tạo một ArrayList từ một mảng trong PowerShell?

$temp = Get-ResourceFiles 
$resourceFiles = New-Object System.Collections.ArrayList($temp) 

đâu $temp là một mảng.

Làm cách nào để đạt được điều đó?

Trả lời

27

Tôi không thể nhận được hàm tạo đó hoạt động. Tuy nhiên, điều này dường như hoạt động:

# $temp = Get-ResourceFiles 
$resourceFiles = New-Object System.Collections.ArrayList($null) 
$resourceFiles.AddRange($temp) 

Bạn cũng có thể chuyển một số nguyên trong hàm tạo để đặt công suất ban đầu.

Bạn có ý gì khi nói rằng bạn muốn liệt kê các tệp? Tại sao bạn không thể lọc các giá trị mong muốn vào một mảng mới?

Edit:

Dường như bạn có thể sử dụng các nhà xây dựng mảng như thế này:

$resourceFiles = New-Object System.Collections.ArrayList(,$someArray) 

Lưu ý các dấu phẩy. Tôi tin rằng những gì đang xảy ra là khi bạn gọi một phương thức .NET, bạn luôn chuyển các tham số như một mảng. PowerShell bỏ gói mảng đó và chuyển nó vào phương thức như các tham số riêng biệt. Trong trường hợp này, chúng tôi không muốn PowerShell giải nén mảng; chúng tôi muốn chuyển mảng thành một đơn vị duy nhất. Bây giờ, toán tử dấu phẩy tạo mảng. Vì vậy, PowerShell unpacks mảng, sau đó chúng tôi tạo ra các mảng một lần nữa với các nhà điều hành dấu phẩy. Tôi nghĩ đó là những gì đang diễn ra.

+0

Làm cách nào để lọc các mục? –

+0

@Mark, bạn có thể cung cấp thêm một số thông tin về cách bạn muốn quyết định loại tệp nào cần xóa không. Ngoài ra, Get-ResourceFiles sẽ trả về những gì? –

+0

Tôi có một tệp văn bản có đường dẫn tương đối trong đó. Sau khi tôi đã liệt kê một thư mục, tôi muốn kiểm tra xem nó có tồn tại trong tệp hay không và nếu nó không tồn tại, hãy xóa nó khỏi danh sách. Get-ResourceFiles chỉ trả lại đường dẫn dưới dạng một chuỗi –

18

Có lẽ phiên bản ngắn:

[System.Collections.ArrayList]$someArray 

Nó cũng nhanh hơn vì nó không gọi tương đối đắt tiền New-Object.

+1

Để có được một ví dụ này thực sự sẽ là [System.Collections.ArrayList] $ someArray = @() mà làm việc cho tôi trong Powershell 3.0, nhưng tôi đã không kiểm tra nếu powershell luôn luôn sử dụng ArrayList như thể hiện của mảng. – npjohns