2013-02-03 48 views
27

Tôi thường xuyên sử dụng [cmdletbinding()] trong các chức năng hoặc tập lệnh của mình nhưng luôn tìm thấy công cụ này bí truyền, có thể một số bạn có thể chia sẻ ánh sáng của họ.
Theo get-help about_Functions_CmdletBindingAttribute[cmdletbinding()] là gì và nó hoạt động như thế nào?

Thuộc tính CmdletBinding là một thuộc tính của các chức năng mà làm cho chúng hoạt động như cmdlet biên soạn

nhưng chúng ta có thể sử dụng nó trên đầu trang của các kịch bản của chúng tôi, chức năng là những gì trong này trường hợp? một hàm "main" ngầm bên trong được gọi bởi động cơ ps cho tất cả các đầu vào của nó?

về cú pháp bây giờ:

[CmdletBinding(ConfirmImpact=<String>, 
        DefaultParameterSetName=<String>, 
        HelpURI=<URI>, 
        SupportsPaging=<Boolean>, 
        SupportsShouldProcess=<Boolean>, 
        PositionalBinding=<Boolean>)] 

những gì chúng ta đang làm gì vậy? khởi tạo một đối tượng cmdlbinding và đưa ra một danh sách đối số cho hàm tạo của nó? cú pháp này có thể được tìm thấy trong param(), ví dụ [Parameter(ValueFromPipeline=$true)] cú pháp này có một tên cụ thể và nó có thể được tìm thấy ở nơi khác?

cuối cùng, chúng ta có thể, như các đại lý quyền hạn đơn giản, để bắt chước chức năng này và sửa đổi hành vi của tập lệnh bằng cách đặt thuộc tính?

+4

Tôi đoán tài liệu được chút gây hiểu lầm ở đây: tất cả điều này có liên quan đến bất kỳ loại khối kịch bản : như Shay đã đề cập - được đặt tên theo tên hàm, theo đường dẫn (tập lệnh) nhưng * cũng * chưa được đặt tên, ví dụ: '& {[CmdletBinding()] param() Write-Verbose 'Foo'} -Verbose' hoạt động giống như một nhà vô địch. – BartekB

+0

@BartekB cảm ơn ok cho phần đầu tiên của câu hỏi. –

Trả lời

11

CmdletBinding, Tham số, vv là các lớp thuộc tính đặc biệt mà người viết kịch bản có thể sử dụng để xác định hành vi của PowerShell, ví dụ: làm cho một chức năng một chức năng nâng cao với Cmdlet capabilites.

Khi bạn gọi cho họ qua ví dụ: [CmdletBinding()] bạn khởi tạo một phiên bản mới của lớp.

Đọc thêm về lớp CmdletBindingAttribute tại địa chỉ: MSDN

Đọc thêm về lớp ParameterAttribute tại địa chỉ: MSDN

Thông tin thêm về các lớp thuộc tính herehere

+0

OK. Vì vậy, khi sử dụng cú pháp hoàn chỉnh, chúng ta chuyển một hashtable đến hàm khởi tạo sẽ được sử dụng để thiết lập các giá trị thành viên công khai? –

+0

theo cách nào đó. hashtables được phân cách bởi ';'. Tôi nghĩ đây là một loại đặc biệt của lớp và cách xây dựng mà quá trình PowerShell có thể sử dụng.Bạn có thể nghĩ về nó như ví dụ 'Câu hỏi mới {Text =" Một số câu hỏi "};' trong C# tôi đoán. Nếu bạn muốn biết nó hoạt động như thế nào, bạn có thể thử dịch ngược Thư viện được chỉ định trong liên kết MSDN của tôi và xem nó có thể đọc được hay không. –

+0

vâng loại hashtable :). –

5

Nói chung, CmdletBinding là những gì tạo nên hàm từ hàm Nâng cao. Đặt nó ở trên cùng của một kịch bản làm cho kịch bản "nâng cao" kịch bản. Các hàm và tập lệnh giống nhau, trong đó tên tệp kịch bản tương đương với tên hàm và nội dung tập lệnh tương đương với phần scripblock của một hàm.

Thuộc tính CmdletBinding cho phép bạn kiểm soát các chức năng của chức năng, chẳng hạn như thêm xác nhận và hỗ trợ WhatIf (thông qua SupportsShouldProcess), Vô hiệu hóa các tham số vị trí ràng buộc, v.v.

+0

Hi Shay, tôi tự hỏi về cách thức hoạt động nội bộ ... –

2

Về câu hỏi cú pháp, định dạng phù hợp chặt chẽ cách bạn áp dụng một lớp thuộc tính .NET cho một thành viên bằng cách sử dụng các tham số có tên trong C#.

So sánh (đơn giản) ngữ pháp cho các thuộc tính từ phần B.2.4 của The PowerShell Language Specification với điều đó từ phần C.2.13 của C# Language Specification:

B.2.4 thuộc tính   (PowerShell)

thuộc tính:
  [thuộc tính tên(thuộc tính đối số) ]

thuộc tính đối số:
  thuộc tính đối số
  thuộc tính đối số
,thuộc tính-đối số

thuộc tính đối số:
  đơn giản tên
=biểu


C.2.13 Thuộc tính   (C#)

thuộc tính:
  [attr ibute tên(tên đối số-list) ]

tên đối số-list:
  tên đối số
  tên đối số-list
,tên đối số

named- đối số:
  số nhận dạng
=thuộc tính-đối số-biểu thức



Tôi đồng ý nó có thể có được tốt đẹp từ một cảm giác ngắn gọn khái niệm để ví dụ tái sử dụng cú pháp khởi tạo hashtable để khởi tạo thuộc tính. Tuy nhiên, tôi có thể tưởng tượng hỗ trợ tất cả các tùy chọn từ hashtables (như [A(P=v)][A('P'=v)]$n = 'P'; [A($n=v)] và một số tập con cụ thể) chỉ sử dụng ; vì ký tự dấu tách sẽ gặp nhiều rắc rối hơn giá trị.

Mặt khác, nếu bạn muốn sử dụng chức năng tiên tiến, thì có lẽ nó làm cho tinh thần để học một cú pháp tiên tiến :)

+0

Thuộc tính không hỗ trợ cú pháp Hashtable vì họ không phải đối phó với các khóa và giá trị thông thường. Các khóa tương ứng với các thuộc tính được xác định rõ trong các lớp mở rộng 'System.Attribute'. – Zenexer

+0

@Zenexer: Đó là một đối số hỗ trợ cú pháp C#, nhưng điều đó không đặt một ràng buộc về ngôn ngữ. Tương tự như vậy, tôi có thể định nghĩa một hashtable '$ h = @ {foo = 2}' và truy cập phần tử với cú pháp thuộc tính '$ h.foo', mặc dù hashtable không thực sự có thuộc tính" foo ". Trong một trường hợp, các nhà thiết kế ngôn ngữ đã chọn một cú pháp linh hoạt, và mặt khác họ đã chọn để hỗ trợ một cú pháp đơn giản hơn. –

+0

Chắc chắn có một mức độ tham gia thiết kế ngôn ngữ, nhưng hãy nhớ rằng PowerShell nằm trên đầu trang của .NET. Các thuộc tính PowerShell là các thuộc tính .NET, vì vậy chúng phải tuân theo các quy tắc thuộc tính .NET. Nó chắc chắn sẽ có thể mở rộng khi các thuộc tính .NET và cung cấp một phiên bản PowerShell cụ thể, nhưng phải có một cách để định nghĩa các thuộc tính .NET do bản chất của PowerShell. – Zenexer

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