2010-09-17 28 views
43

Tôi đang sử dụng thông số chuyển đổi trong tập lệnh PowerShell của mình theo cách này.Enum như tham số chuyển đổi trong PowerShell

param(
    [switch] $Word, 
    [switch] $Excel, 
    [switch] $powerpoint, 
    [switch] $v2007, 
    [switch] $v2010, 
    [switch] $x86, 
    [switch] $x64, 
) 

Tôi đang cố gắng tìm ra cách gọn gàng để có phong cách enum hơn. Như mọi người có thể đoán, tôi muốn người dùng lựa chọn giữa từ, excel và powerpoint. Và giữa x2007 và v2010.

Có cách nào gọn gàng để lấy tham số đầu vào kiểu enum không?

Tôi mới sử dụng PowerShell. Vì vậy, nếu điều này nghe có vẻ như tôi không biết một cái gì đó hiển nhiên, sau đó xin vui lòng chỉ cho tôi một số liên kết mà tôi có thể đọc về nó.

Trả lời

75

Tôi sẽ sử dụng thuộc tính tham số ValidateSet.

Từ: about_Functions_Advanced_Parameters

Thuộc tính ValidateSet xác định một tập hợp các giá trị hợp lệ cho một tham số hoặc biến. Windows PowerShell sẽ tạo ra lỗi nếu thông số hoặc giá trị biến không khớp với giá trị trong tập hợp.

Ví dụ chức năng:

function test-value 
{ 
    param(
     [Parameter(Position=0)] 
     [ValidateSet('word','excel','powerpoint')] 
     [System.String]$Application, 

     [Parameter(Position=1)] 
     [ValidateSet('v2007','v2010')] 
     [System.String]$Version 
    ) 


    write-host "Application: $Application" 
    write-host "Version: $Version" 
} 


PS > test-value -application foo 

Output:

test-value : Cannot validate argument on parameter 'Application'. The argument "foo" does not belong to the set "word,excel,powerpoint" specified by the ValidateSet attribute. Supply an argument that is in the set and then try the command again.

+0

Cách tiếp cận này buộc bạn sử dụng các chức năng nâng cao mà không phải là * luôn luôn * mong muốn. Bạn cũng không nhận được bất kỳ hình thức tự động hoàn thành nào trên các giá trị enum. OTOH bạn không phải đặt đánh giá enum trong parens, ví dụ: '[MyEnum] :: A'. Vì vậy, một túi hỗn hợp tôi đoán. :-) –

+0

Cảm ơn Keith. Mặt khác, hàm cần thực hiện các kiểm tra tham số khác nhau để tìm ra nếu có nhiều hơn một tham số chuyển đổi đã được chỉ định hay không. BTW, không phải tất cả chúng ta đều sử dụng PowerShell v2 :) –

+0

Keith, bạn sẽ mở rộng tab trên ValidateSet nếu bạn sử dụng PowerTab ... chỉ cần nói. ;) – JasonMArcher

7

Điều này blog post by the PowerShell team xác định cách thực hiện việc này trong PowerShell 1.0. Trong PowerShell 2.0, bạn có thể sử dụng Add-Type như vậy:

C:\PS> Add-Type -TypeDefinition @' 
>> public enum MyEnum { 
>> A, 
>> B, 
>> C, 
>> D 
>> } 
>> '@ 
>> 

Cập nhật: Dưới đây là làm thế nào để sử dụng enum:

C:\PS> function foo([MyEnum]$enum) { $enum } 
C:\PS> foo ([MyEnum]::A) 
A 

Bạn cần ngoặc xung quanh tranh luận để phân tích lập luận như một Kiểu. Điều này là bắt buộc vì các đối số được xử lý nhiều hay ít như chuỗi. Biết được điều này, bạn cũng có thể vượt qua chúng enum trong một hình thức chuỗi đơn giản và PowerShell sẽ tìm nó ra:

C:\PS> foo A 
A 
C:\PS> $arg = "B" 
C:\PS> foo $arg 
B 
C:\PS> foo F 
error* 

lỗi - F không phải là một trong những giá trị được liệt kê - giá trị hợp lệ bao gồm A, B, C, D *

+0

Nhưng làm thế nào tôi có thể sử dụng các ví dụ về enum cho dòng lệnh mục đích "param"? – bits

+0

một ví dụ thú vị, nhưng tôi nghĩ rằng nó không thực sự hữu ích trong trường hợp này. –

+1

Yeah phải sử dụng loại parens cắn. OTOH Tôi thích tab-hoàn thành - điều tốt nhất tiếp theo để xác minh tĩnh thực sự của giá trị enum. ValidateSet chắc chắn là một tính năng tốt đẹp để có trong ngôn ngữ, chỉ cần quá xấu PowerShell không sử dụng thông tin đó để lái xe hoàn thành tab.BTW nếu nó chỉ là một tập hợp các lựa chọn, bạn có thể sử dụng các công tắc như OP sử dụng - chỉ cần đặt mỗi công tắc trong bộ tham số riêng biệt và chọn một biến làm mặc định (nếu không có chỉ định nào). –

7

Bạn có thể sử dụng ValidateSet thuộc tính:

function My-Func 
{ 
    param (
     [Parameter(Mandatory = $true)] 
     [ValidateNotNullOrEmpty()] 
     [ValidateSet('Word', 'Excel', 'PowerPoint', 'v2007', 'v2010', 'x86', 'x64')] 
     [String]$MyParam 
    ) 

    Write-Host "Performing action for $MyParam" 
} 

My-Func -MyParam 'Word' 
My-Func -MyParam 'v2007' 
My-Func -MyParam 'SomeVal' 

Output:

Performing action for Word 
Performing action for v2007 
My-Func : Cannot validate argument on parameter 'MyParam'. The argument "SomeVal" does not belong to the set "Word,Excel,PowerPoint,v2007,v2010,x86,x64" specified by the ValidateSet attribute. Supply an argument that is in the 
set and then try the command again. 
At C:\Users\George\Documents\PowerShell V2\ValidateSetTest.ps1:15 char:17 
+ My-Func -MyParam <<<< 'SomeVal' 
    + CategoryInfo   : InvalidData: (:) [My-Func], ParameterBindingValidationException 
    + FullyQualifiedErrorId : ParameterArgumentValidationError,My-Func 
Các vấn đề liên quan