2013-06-05 27 views
13

Tôi vừa nhận ra điều này và tôi đã học được nó một cách khó khăn, vì vậy tôi muốn chia sẻ. Hãy xem xét bạn có danh sách sau đây của chuỗi:Một lưu ý khi sử dụng các bộ sưu tập .NET (ArrayList, List, ..) trong PowerShell

>$list = New-Object -TypeName System.Collections.Generic.List[string] 
>$list.Add("x") 
>$list.Add("yy") 
>$list.Add("zzz") 
>$list 
x 
yy 
zzz 

Bây giờ nếu bạn muốn nhận được số lượng các mục trong danh sách, bạn sẽ truy cập vào thuộc tính Count, và nó mang lại cho bạn "3" như mong đợi.

>$list.Count 
3 

Tuy nhiên, đôi khi bạn sẽ nhầm lẫn khi truy cập .Length thay vì .Count. Trong các ngôn ngữ khác, như Python hoặc C#, bạn sẽ gặp lỗi khi nói thuộc tính này không khả dụng. Nhưng trong PowerShell, nó chỉ ra rằng, nếu nó không được tìm thấy trên đối tượng đó, nó sẽ lặp lại thông qua các đối tượng chứa và truy cập thuộc tính trên chúng. Vì vậy, bạn sẽ có danh sách Độ dài! Sự ngạc nhiên!!

>$list.Length 
1 
2 
3 

Bạn thậm chí có thể gọi phương pháp!

>$list.ToUpper() 
X 
YY 
ZZZ 

Lưu ý rằng, như tôi đã thử, tính năng "" này cũng hoạt động cho System.Collections.ArrayList. Nhưng nó không hoạt động đối với kiểu mảng dựng sẵn của PowerShell.

Tính năng "này" được gọi là gì? Và tại sao nó được thiết kế theo cách như vậy? Nó rất đáng ngạc nhiên và dễ bị lỗi.

+4

Nó đã được gọi là nhiều thứ. Việc liệt kê thành viên là IIRC mới nhất. Xem http://blogs.msdn.com/b/powershell/archive/2012/06/14/new-v3-language-features.aspx –

+0

Tôi không thích tính năng "mới" này (được giới thiệu trong PSv3) - nó làm cho kịch bản của bạn ngược trở lại không tương thích với PSv2 ... :(Tôi thực sự không nghĩ rằng số lượng giảm một chút các ký tự biện minh cho khả năng tương thích ngược. –

+0

Andy, tôi đang già đi, vì vậy tôi ở đâu đó chia sẻ ý kiến ​​của bạn, nhưng nếu một số mới tập lệnh sẽ không chạy trong PowerShell V2.0, Bất kỳ điều gì xảy ra với các tập lệnh cũ đã thực sự hoạt động trong PowerShell V2.0 sẽ hoạt động trong PowerShell phiên bản 3.0. Như thường lệ trong thiết bị máy tính bạn cần phải tuân theo kỹ thuật cũ hơn, điều này không nên dừng lại – JPBlanc

Trả lời

4

Keith Hill đã đề cập trong nhận xét rằng đây là một tính năng mới có tên là Liệt kê thành viên trong V3. Tham khảo this MSDN article.

+2

Để theo dõi nhận xét của @SteveKaye, tôi sẽ thêm ít nhất "lý do" từ liên kết tuyệt vời, ở trên. "Chúng tôi đã thêm tính năng này để giúp dễ dàng xử lý các lệnh trả về một hoặc nhiều đối tượng. Người viết PowerShell kinh nghiệm biết rằng họ cần sử dụng @() để xử lý tình huống đó một cách chính xác, nhưng chúng tôi thực sự nghĩ rằng đó là hoàn hảo ... Chúng tôi không biết bất kỳ tập lệnh nào mà thay đổi này đã phá vỡ tập lệnh nhưng không hiển thị vấn đề cơ bản trong tập lệnh. "' Tính năng thú vị. – ruffin

Các vấn đề liên quan