2012-09-14 67 views
16

Tôi có kịch bản này có thể được gọi bằng hai cách:Làm thế nào để cung cấp các thuộc tính param cho một kịch bản trong Powershell?

MyScript -foo path\to\folder 

hoặc

MyScript -bar path\to\folder 

(Đó là, tôi có thể vượt qua một công tắc cộng với một thư mục hoặc một đối số chuỗi cộng với một thư mục.)

tôi đã cố gắng đưa parameter declarations vào kịch bản của tôi như để phản ánh cú pháp rằng:

param(
    [parameter(Mandatory=$false)] [switch]$foo, 
    [parameter(Mandatory=$false)] [String]$bar, 
    [parameter(Mandatory=$true)] [System.IO.FileInfo]$path 
) 

Nhưng sau đó tôi phải vượt qua path một cách rõ ràng để gọi kịch bản:

MyScript -l -path path\to\folder 

Vì vậy (làm thế nào) tôi có thể làm điều đó làm cho cả hai barpath tham số vị trí?

Lưu ý: Nếu tôi đã chọn một cú pháp cực kỳ ngu ngốc để gọi tập lệnh, tôi vẫn có thể thay đổi nó.

Trả lời

26

Một vài điều: Bạn cần phải sử dụng các bộ tham số để cho PowerShell biết rằng có hai cách riêng biệt để gọi tập lệnh của bạn; đó là để nói, bạn không thể sử dụng chuyển đổi và chuỗi cùng một lúc. Các bộ cũng phục vụ cho phép bạn đặt vị trí của cả hai $bar$filepath để ở chỉ mục 0. Các công tắc không cần phải được đặt ở vị trí vì chúng không mơ hồ với chất kết dính và được đặt ở bất kỳ đâu. Ngoài ra, ít nhất một tham số trong mỗi bộ phải là bắt buộc.

function test-set { 
    [CmdletBinding(DefaultParameterSetName = "BarSet")] 
    param(
     [parameter(
      mandatory=$true, 
      parametersetname="FooSet" 
     )] 
     [switch]$Foo, 

     [parameter(
      mandatory=$true, 
      position=0, 
      parametersetname="BarSet" 
     )] 
     [string]$Bar, 

     [parameter(
      mandatory=$true, 
      position=1 
     )] 
     [io.fileinfo]$FilePath 
    ) 
@" 
    Parameterset is: {0} 
    Bar is: '{1}' 
    -Foo present: {2} 
    FilePath: {3} 
"@ -f $PSCmdlet.ParameterSetName, $bar, $foo.IsPresent, $FilePath 
} 

Thuộc tính CmdletBinding là cần thiết để xác định các thông số thiết lập nên là mặc định nếu hàm được gọi mà không tham số.

Dưới đây là sự giúp đỡ cú pháp cho cấu hình trên:

PS> test-set -? 

NAME 
    test-set 

SYNTAX 
    test-set [-Bar] <string> [-FilePath] <FileInfo> [<CommonParameters>] 

    test-set [-FilePath] <FileInfo> -Foo [<CommonParameters>] 

Và đây là đầu ra cho lời gọi khác nhau:

PS> test-set barval C:\temp\foo.zip 
    Parameterset is: BarSet 
    Bar is: 'barval' 
    -Foo present: False 
    FilePath: C:\temp\foo.zip 

PS> test-set -foo c:\temp\foo.zip 
    Parameterset is: FooSet 
    Bar is: '' 
    -Foo present: True 
    FilePath: c:\temp\foo.zip 

Hope this helps.

+0

Ok, do đó, điều này đã làm nó, và nó bây giờ tất cả các công trình đẹp. Cảm ơn rất nhiều! – sbi

0

Khi giải thích here bạn có thể chỉ định vị trí thông số của thông số của mình.

[parameter(Position=0)] 
+1

Nhưng điều này sẽ không cho phép cú pháp gọi thứ hai. –

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