2012-04-11 8 views
5

Theo MSDN:Declare được accessors trong PowerShell thông số cmdlet

"Parameters phải được khai báo trên các lĩnh vực phi public static hoặc tính thông số cần được khai báo trên thuộc tính Thuộc tính phải có một bộ nào.. người truy cập và nếu từ khóa ValueFromPipeline hoặc ValueFromPipelineByPropertyName được chỉ định, thuộc tính phải có người truy cập công khai. "

Tại sao tôi phải khai báo truy cập trong cmdlet ValueFromPipeline thông số của mình? Theo như tôi biết, PowerShell chỉ cần đặt giá trị của họ vào, không đọc chúng ra. Cảm ơn (bằng cách im chỉ tò mò về hành vi này :)).

+0

Có vẻ như một yêu cầu kỳ lạ. Tôi chỉ có thể giả định nó là một hiện vật thực hiện (ví dụ trừu tượng bị rò rỉ): theo mã thông qua khi xử lý các xác nhận hợp lệ và các kiểu chuyển đổi được áp dụng cho các thuộc tính tham số cho thấy việc xử lý không đơn giản. Mặt khác, tôi hiếm khi sử dụng bất cứ điều gì khác hơn là một tài sản tự động với thiết lập công cộng và nhận được và không thể nghĩ về một hoàn cảnh mà tôi sẽ muốn bất cứ điều gì khác. – Richard

Trả lời

3

PowerShell đọc giá trị mặc định các thông số được đánh dấu bằng ValueFromPipeline hoặc ValueFromPipelineByPropertyName để thực hiện một sao lưu trước gán giá trị mới thu được từ the pipeline.

Hãy xem xét các lệnh sau:

New-Post -Title <string> 
Set-Post -InputObject <Post> -Title <string> 

nơi sau đây áp dụng:

  • các New-Post cmdlet trả mới được tạo ra Post đối tượng để các đường ống dẫn, mà một Title tài sản
  • tài sản InputObject o n lệnh ghép ngắn Set-Post được đánh dấu bằng ValueFromPipeline = true
  • thuộc tính Title trên cmdlet được đánh dấu bằng ValueFromPipelineByPropertyName = true.

Kết hợp chúng với lệnh sau:

New-Post -Title "Foo" | Set-Post 

và thiết lập một breakpoint trên get accessor của Title kết quả tài sản Set-Post cmdlet trong stack trace sau:

Stack trace for parameter binding in PowerShell

Như bạn có thể thấy, phương thức CmdletParameterBinderController.GetDefaultParameterValue được gọi trong quá trình ràng buộc Title thuộc tính trên lệnh ghép ngắn Set-Post với giá trị từ thuộc tính tương ứng trên đối tượng đến từ đường ống.

+0

+1 Để trích dẫn nguyên tắc ít ngạc nhiên nhất. –

+0

-1. Trong khi có một logic để điều này, nó không phải là cách PSH hoạt động. Trong cmdlet bạn gọi 'WriteObject' để truyền các đối tượng (hoặc các collection) tới bước tiếp theo của đường ống. – Richard

+0

@Richard Tôi nghĩ rằng bạn hiểu lầm quan điểm của tôi.Tôi không nói về việc ngăn chặn toàn bộ đối tượng không được truyền qua đường ống mà là việc gán tự động các tham số * có cùng tên. PowerShell sẽ không thể truy lục giá trị được gán cho các tham số của lệnh ghép ngắn nếu các thuộc tính tương ứng là * chỉ ghi *. –