2017-07-13 16 views
1

ユーザに入力(ウェブアドレス、ユーザ名、パスワードなど)を促し、それらの入力を検証したり、ユーザに再度プロンプトを出すスクリプトがあります。サブルーチンへのオプションパラメータの受け渡し

ここでは、これらのパラメータのいくつかをコマンドラインで提供しながら、オプションのパラメータとしてそれらを元のサブルーチンに渡すことで、このスクリプトを呼び出すことができます。しかし、スクリプトの範囲では、パラメータが$PSBoundParameters.ContainsKey('a')で供給されたかどうかをテストすることができますが、パラメータ$a(まだ提供されていない可能性があります)を関数に渡すと、同じテストは常に$Trueを返します。

サンプルコード:

function main { 
    param (
     [string]$a 
    ) 
    if ($PSBoundParameters.ContainsKey('a')) { 
     "main - a is $a" 
    } 
    else { 
     "main - didn't get a" 
    } 
    getStr $a 
} 

function getStr { 
    param (
     [string]$a 
    ) 
    if ($PSBoundParameters.ContainsKey('a')) { 
     "getStr - a is $a" 
    } 
    else { 
     "getStr - didn't get a" 
    } 
} 

入力:

main 

main "hello" 

予想される出力:

main - didn't get a 
getStr - didn't get a 

main - a is hello 
getStr - a is hello 

実際の出力:

main - didn't get a 
getStr - a is 

main - a is hello 
getStr - a is hello 

私の推測では、getStr $aを呼び出すとき$aがインスタンス化されることで、これを処理するために、よりエレガント/正しい方法はありますか?

答えて

2

@PSBoundParametersを使用してください。私はスクリプトとしてこれを実行できるようにあなたの関数を変更しました。

コード

param (
    [string]$a 
) 

function main { 
    param (
     [string]$a 
    ) 
    if ($PSBoundParameters.ContainsKey('a')) { 
     "main - a is $a" 
    } 
    else { 
     "main - didn't get a" 
    } 
    getStr @PSBoundParameters 
} 

function getStr { 
    param (
     [string]$a 
    ) 
    if ($PSBoundParameters.ContainsKey('a')) { 
     "getStr - a is $a" 
    } 
    else { 
     "getStr - didn't get a" 
    } 
} 
main @PSBoundParameters 

出力

PS C:\> .\code.ps1 -a string 
main - a is string 
getStr - a is string 
PS C:\> .\code.ps1 
main - didn't get a 
getStr - didn't get a 
+0

が述べたように、これは問題を解決し、ありがとうございます。もし私が - 各サブルーチンが1つだけをチェックする必要があるいくつかのパラメータを得るかもしれないケースはどうですか? –

+1

将来参照するには、自分自身でこれをテストしたところ、各関数にスプ​​ラット( '@') 'PSBoundVariables'を送信して、必要なキーをチェックします。 –

関連する問題