# array
C:\> (1,2,3).count
3
C:\> (1,2,3 | measure).count
3
# hashtable
C:\> @{1=1; 2=2; 3=3}.count
3
C:\> (@{1=1; 2=2; 3=3} | measure).count
1
# array returned from function
C:\> function UnrollMe { $args }
C:\> (UnrollMe a,b,c).count
3
C:\> (UnrollMe a,b,c | measure).count
1
C:\> (1,2,3).gettype() -eq (UnrollMe a,b,c).gettype()
True
Sự khác biệt với HashTables là fairly well known, mặc dù official documentation chỉ đề cập đến nó một cách xiên (thông qua ví dụ).Điều gì xác định xem đường ống Powershell sẽ hủy bỏ một bộ sưu tập?
Vấn đề với chức năng là tin tức đối với tôi. Tôi hơi sốc vì nó đã không cắn tôi trước đây. Có một số nguyên tắc hướng dẫn mà chúng ta có thể làm theo không? Tôi biết rằng khi viết các lệnh ghép ngắn trong C# có overload of WriteObject nơi bạn có thể kiểm soát điều tra một cách rõ ràng, nhưng AFAIK không có cấu trúc như vậy trong chính ngôn ngữ Posh. Như ví dụ cuối cùng cho thấy, các thông dịch viên Posh dường như tin rằng không có sự khác biệt trong các loại đối tượng được đường ống. Tôi nghi ngờ có thể có một số Object vs PSObject weirdness dưới mui xe, nhưng đó là sử dụng ít khi bạn đang viết Posh tinh khiết và mong đợi các ngôn ngữ kịch bản để "chỉ làm việc."
/EDIT/
Keith là chính xác chỉ ra rằng trong ví dụ của tôi, tôi đi qua trong một đơn string [] lập luận chứ không phải là 3 đối số chuỗi. Nói cách khác, lý do Measure-Object nói Count = 1 là bởi vì nó nhìn thấy một mảng đơn của mảng có phần tử đầu tiên là @ ("a", "b", "c"). Đủ công bằng. Kiến thức này cho phép bạn làm việc xung quanh vấn đề này bằng nhiều cách:
# stick to single objects
C:\> (UnrollMe a b c | measure).count
3
# rewrite the function to handle nesting
C:\> function UnrollMe2 { $args[0] }
C:\> (UnrollMe2 a,b,c | measure).count
3
# ditto
C:\> function UnrollMe3 { $args | %{ $_ } }
C:\> (UnrollMe3 a,b,c | measure).count
3
Tuy nhiên, nó không giải thích tất cả mọi thứ ...
# as seen earlier - if we're truly returning @(@("a","b","c")) why not count=1?
C:\> (UnrollMe a,b,c).count
3
# our theory must also explain these results:
C:\> ((UnrollMe a,b,c) | measure).count
3
C:\> (@(@("a","b","c")) | measure).count
3
C:\> ((UnrollMe a,b,c d) | measure).count
2
Từ những gì tôi có thể ngoại suy có một quy tắc chơi: nếu bạn có một mảng với chính xác một phần tử VÀ trình phân tích cú pháp nằm trong expression mode, thì trình thông dịch sẽ "unwrap" phần tử đã nói. Tôi còn thiếu bất kỳ sự tinh tế nào nữa không?
Tương đương với WriteObject là lệnh ghép ngắn đầu ra (bí danh thành echo) mà mọi người hiếm khi sử dụng vì giá trị được ngầm xuất ra luồng stdout. –
Đúng, mặc dù Write-Output không có tham số -EnumerateCollection như WriteObject (đối tượng, bool). –
liên quan: http://stackoverflow.com/questions/28702588/in-what-conditions-does-powershell-unroll-items-in-the-pipeline/28707054#28707054 – alx9r