2009-07-29 14 views
5

Trong PowerShell 1.0, nếu tôi có tham số cmdlet của kiểu enum, phương pháp được đề xuất để kiểm tra xem người dùng đã chỉ định tham số đó trên dòng lệnh cmdlet là gì? Ví dụ:Làm cách nào để xác định liệu giá trị tham số PowerShell Cmdlet đã được chỉ định?

MyEnum : int { No = 0, Yes = 1, MaybeSo = 2 } 

class DoSomethingCommand : PSCmdlet 
... 
private MyEnum isEnabled; 

[Parameter(Mandatory = false)] 
public MyEnum IsEnabled 
{ 
    get { return isEnabled; } 
    set { isEnabled = value; } 
} 

protected override void ProcessRecord() 
{ 
    // How do I know if the user passed -IsEnabled <value> to the cmdlet? 
} 

Có cách nào để thực hiện việc này mà không cần phải gieo hạt được kích hoạt bằng giá trị giả không? Theo mặc định nó sẽ bằng 0, và tôi không muốn phải hạt giống mọi tham số hoặc thêm một giá trị giả vào enum của tôi. Tôi có khả năng nhận được nhiều lệnh ghép ngắn với 100 tham số, phải có cách tốt hơn. Điều này liên quan đến this question nhưng tôi đang tìm kiếm một cách làm sạch hơn. Cảm ơn.

+0

@Jack Straw Nếu bạn có "khả năng có nhiều lệnh ghép ngắn với 100 tham số", bạn có thể muốn xem xét một số chức năng đó. Một trong những lợi ích chính của PowerShell là khả năng phát hiện và có số lượng lớn các tham số giúp cho việc khám phá bản thân trở nên khó khăn hơn nhiều. –

+0

@Steven, xin lỗi tôi có thể đã gây hiểu lầm - không phải mỗi lệnh có 100 tham số :), nhưng nhiều lệnh ghép ngắn dẫn đến nhiều tham số. Cảm ơn bình luận của bạn. –

Trả lời

8

Trong trường hợp này, tôi sẽ sử dụng một wrapper nullable xung quanh kiểu enum ví dụ

[Parameter(Mandatory = false)] 
public MyEnum? IsEnabled { get; set; } 

Lưu ý? sửa đổi trên MyEnum. Sau đó, bạn có thể kiểm tra nếu nó được thiết lập như vậy:

if (this.IsEnabled.HasValue) { ... } 
+0

Đó chính xác là những gì tôi đang tìm kiếm. Cảm ơn. Tôi thực sự đã tạo biến cục bộ, không phải thuộc tính kiểu nullable, cũng hoạt động. –

1

Điều duy nhất tôi có thể thấy là sửa đổi enum của bạn sao cho giá trị 0 được đặt tên là Không xác định hoặc một cái gì đó tương tự.

Vấn đề là enums chỉ là số nguyên trong nền và số nguyên là các loại giá trị. Kết quả không may là họ cần phải có giá trị và giá trị đó là 0 theo mặc định.

+0

@Josip, cảm ơn, tôi thấy điểm. Xem bình luận của tôi để x0n. –

4

PowerShell sang một bên, không bao giờ là kiểu tốt để sử dụng 0 theo cách đó. Bạn nên luôn luôn sử dụng 0 cho mặc định phù hợp nhất. Trong trường hợp này, mặc định thích hợp nhất sẽ là một cái gì đó như "Bỏ đặt".

Cuối cùng, điều này không liên quan gì đến PowerShell và mọi thứ liên quan đến thực hành mã hóa tốt cho .NET.

  • Oisin
+0

@ x0n: Cảm ơn bạn đã phản hồi. Việc sử dụng 0 hay không cho giá trị enum là một điểm đáng tranh cãi, nhưng một trong hai cách sản phẩm hiện tại của tôi có nhiều giá trị 0 cho enums. Tôi đoán câu hỏi rộng hơn của tôi là, đây có phải là các nhà phát triển cmdlet mẫu sử dụng trong tình huống này không? Sử dụng giá trị mặc định, 'không xác định' cho mỗi tham số và thử nghiệm so với giá trị tham số đó trước khi áp dụng các giá trị tham số cho đối tượng trong ProcessRecord()? Điều này có thể hơi khó sử dụng cho các sản phẩm lớn với nhiều loại tham số. –

+2

Trong v2.0 của powershell, một thuộc tính mới đã được thêm vào: this.MyInvocation.BoundParameters nơi "this" là PSCmdlet.Đây là một hashtable của cặp khóa/giá trị của các tên tham số và các giá trị đã được ràng buộc với cmdlet. Nếu enum của bạn đã được chỉ định, nó sẽ có trong từ điển này. Nếu nó được mặc định, nó sẽ không có ở đó. Tôi không nhận thức được bất cứ điều gì khác hơn là hack chuỗi sẽ làm như vậy trong v1.0 – x0n

+0

x0n, cảm ơn, tôi thấy rằng 2.0 tài sản. Thật không may, tôi cần phải mã với 1.0 cho bây giờ. Tôi nghĩ rằng câu trả lời của Keith dưới đây, sử dụng một wrapper nullable, là chính xác những gì tôi đang tìm kiếm. –

1

Tôi biết chủ đề này hơi cũ, nhưng cách tốt nhất để làm điều này là khai báo tham số của bạn bằng cách sử dụng loại SwitchParameter. Sau đó, người dùng của bạn không phải vượt qua -IsEnabled, họ sẽ chỉ thêm một cái gì đó như -Được kích hoạt như một tham số.

Sau đó, bạn kiểm tra thuộc tính .IsPresent của tham số để xem người gọi có được thêm hay không -Được kích hoạt cho lệnh gọi đến lệnh ghép ngắn.

+0

@ Darren: đó chắc chắn làm việc cho params bool, nhưng tôi đã tìm kiếm một giải pháp cho các tham số phi bool tùy chọn. Loại nullable dường như hoạt động tốt. Tất nhiên PS v2 bây giờ có một từ điển của params có sẵn trong cmdlet, vì vậy đó có lẽ là con đường để đi. Cảm ơn. –

0
bool wasSpecified = MyInvocation.BoundParameters.ContainsKey("IsEnabled"); 
+0

Lưu ý rằng điều này không hoạt động chính xác với các tham số Vị trí. Chúng không được tìm thấy bởi Name trong BoundParameters, nhưng được xác định và có một giá trị. –