18

次の 2 つの方法で呼び出すことができるスクリプトがあります。

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
)

ただしpath、スクリプトを呼び出すには、明示的に渡す必要があります。

MyScript -l -path path\to\folder

では、(どのように)barpath位置パラメータの両方を作成できますか?

: スクリプトを呼び出すために非常にばかげた構文を選択した場合でも、それを変更できます。

4

2 に答える 2

28

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

お役に立てれば。

于 2012-09-14T13:14:24.327 に答える
0

ここで説明したように、パラメーターのパラメーター位置を指定できます。

[parameter(Position=0)]
于 2012-09-14T12:46:01.463 に答える