2012-09-14 17 views
16

私は2つの方法で呼び出すことができます。このスクリプトを持っている:Powershellでスクリプトのparam属性を指定する方法は?

MyScript -foo path\to\folder 

または

MyScript -bar path\to\folder 

(つまり、私はスイッチプラスフォルダまたは文字列引数を加えたフォルダを渡すことができますいずれかを。

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

私はその構文を反映するように私のスクリプトにparameter declarationsを入れて試してみました

しかし、その後、私は、スクリプトを呼び出すために、明示的にpathを渡す必要があります:

MyScript -l -path path\to\folder 

だから、(どのように)私は両方barpath位置パラメータを作ることができますか?

ノート:スクリプトを呼び出すために非常に愚かな構文を選んだとしても、それでも変更できます。

答えて

26

2つのこと:パラメータセットを使用して、スクリプトを呼び出す相互に排他的な方法があることをPowerShellに伝える必要があります。つまり、スイッチと文字列を同時に使用することはできません。これらのセットは、$bar$filepathの位置をインデックス0に設定することもできます。スイッチは、バインダーにあいまいでなくどこにでも置くことができるため、配置する必要はありません。また、各セットの少なくとも1つのパラメータは必須である必要があります。

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

しかし、これは2番目の呼び出し構文を許可しません。 –

関連する問題