2012-05-25 11 views
6

Có cách nào để có một số tham số bắt buộc dựa trên một số điều kiện (ví dụ: nếu một trong các tham số không có hoặc sai) trong hàm powershell?Các thông số về quyền hạn có điều kiện

Ý tưởng của tôi là có thể gọi hàm theo hai cách. Ví dụ cụ thể là hàm lấy danh sách từ sharepoint - tôi có thể gọi nó với danh sách url tương đối (một và chỉ tham số) HOẶC với url web và danh sách tên hiển thị (hai thông số, cả hai bắt buộc, nhưng chỉ khi danh sách url tương đối là không được sử dụng).

Tôi hy vọng câu hỏi của tôi là rõ ràng.

Trả lời

9

Như Christian cho biết điều này có thể được thực hiện thông qua ParameterSetNames. Hãy xem ví dụ sau:

function Get-MySPWeb { 
    [CmdletBinding(DefaultParameterSetName="set1")] 
    param (
     [parameter(ParameterSetName="set1")] $RelativeUrl, 
     [parameter(ParameterSetName="set2")] $WebUrl, 
     [parameter(ParameterSetName="set2", Mandatory=$true)] $DisplayName 
    ) 
    Write-Host ("Parameter set in action: " + $PSCmdlet.ParameterSetName) 
    Write-Host ("RelativeUrl: " + $RelativeUrl) 
    Write-Host ("WebUrl: " + $WebUrl) 
    Write-Host ("DisplayName: " + $DisplayName) 

} 

Nếu bạn chạy nó với -RelativeUrl Foo nó sẽ liên kết với "set1". Nếu bạn gọi hàm này không có tham số, nó cũng sẽ liên kết với "set1".

(Note -khi không có các thông số được cung cấp trong PowerShell v3 (có xem trước tiêu dùng Win8) nó sẽ liên kết với "set1", tuy nhiên nó sẽ báo lỗi ràng buộc trong PowerShell v2 trừ khi bạn thêm [CmdletBinding(DefaultParameterSetName="set1")] vào khối param Cảm ơn. @ x0n cho mẹo DefaultParameterSetName!)

Nếu bạn cố gắng chạy nó với giá trị tham số từ cả hai bộ, bạn sẽ gặp lỗi.

Nếu bạn chạy nó với -WebUrl Bar nó sẽ nhắc bạn cho một giá trị tham số cho DisplayName vì nó là một tham số bắt buộc.

+0

Đây chính là điều tôi cần! Cảm ơn bạn! Chỉ có một điều: khi tôi chạy điều này mà không có tham số, tôi nhận được một lỗi (nhưng tôi muốn nó theo cách này). Một câu hỏi tiếp theo: khi sử dụng các tham số, nó được sử dụng để chuyển đổi với biến $ PSCmdlet.ParameterSetName, phải không? – jumbo

+0

Phải, '$ PSCmdlet.ParameterSetName' có sẵn để bạn có thể thực hiện hành động thích hợp dựa trên bộ tham số được đánh giá bởi quá trình ràng buộc tham số. BTW nó thú vị bạn nhận được một lỗi, có vẻ như đây là một sự khác biệt trong hành vi giữa PSv2 và PSv3. –

+1

Bí quyết để làm cho nó hoạt động như v3 là sử dụng một tham số thiết lập mặc định. Tôi đã chỉnh sửa câu trả lời của bạn để hiển thị điều này. – x0n

1

Bạn cần sử dụng Parameters Set naming. Bạn có thể gán thông số exlusive cho tên bộ tham số khác nhau.

+0

Bạn có thể cho tôi một ví dụ nhỏ về cách tôi có thể hoàn thành những gì tôi đã viết không? – jumbo

+0

Đọc tại đây http://blogs.technet.com/b/heyscriptingguy/archive/2011/06/30/use-parameter-sets-to-simplify-powershell-commands.aspx Tôi quá bận để viết một ví dụ nhưng liên kết đưa ra một lời giải thích thực sự tốt. –

+1

Mã trong nhận xét có vẻ không hợp lệ ... nhưng: thông số ( [Tham số (ParameterSetName = 'rel', Bắt buộc = $ true)] [string] $ RelativeUrl, [ParameterSetName = 'web', Mandatory = $ true)] [string] $ WebUrl, [Tham số (ParameterSetName = 'web', Bắt buộc = $ true)] [string] $ DisplayName ) Bây giờ bạn phải tham số * bộ *, một cho mỗi trường hợp. Tham số có thể đi đến nhiều bộ hoặc tất cả các bộ (nếu không có parameterSetName được chỉ định). Thêm thông tin trợ giúp about_Functions_Advanced_Parameters – BartekB