2012-09-14 57 views
16

我有這個腳本,可以用兩種方式來調用:如何在Powershell中爲腳本提供參數屬性?

MyScript -foo path\to\folder 

MyScript -bar path\to\folder 

(也就是說,我可以通過一個開關加一個文件夾或字符串參數加上一個文件夾。 )

我試圖把parameter declarations到我的腳本,以反映語法:

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

但我必須要通過path明確調用腳本:

MyScript -l -path path\to\folder 

那麼(如何)我能做到這使得無論barpath位置參數?

注意:如果我選擇了一個非常愚蠢的語法來調用腳本,我仍然可以改變它。

回答

26

幾件事情:你需要使用參數設置來告訴PowerShell中,有互相排斥的方式來調用腳本;也就是說,你不能同時使用開關和字符串。這些設置還可以讓您將$bar$filepath的位置設置爲索引0.切換器不需要位置放置,因爲它們對活頁夾沒有歧義,並且可以放置在任何位置。而且,每組中至少有一個參數應該是強制性的。

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 
} 

是需要的,CmdletBinding屬性來指定哪些參數集應該是默認的,如果函數調用而不參數。

下面是上述配置的語法幫助:

PS> test-set -? 

NAME 
    test-set 

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

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

而這裏的各種調用輸出:

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 

希望這有助於。

+0

好吧,這樣做,它現在都運作得很好。非常感謝! – sbi

0

作爲解釋here您可以指定參數的參數位置。

[parameter(Position=0)] 
+1

但是這不允許第二個調用語法。 –

相關問題