3

Powershell V2では、Param()宣言を使用して、スクリプトに渡されたスイッチを解析しようとしています。私の問題は、このスクリプト(example.ps1)を使用して説明できます。

Param(
    [switch] $A,
    [switch] $B,
    [switch] $C
)
echo "$A, $B, $C"

私の問題は、このスクリプトが誤ったスイッチを黙って無視することです。たとえば、「example.ps1 -asdf」は、誤った使用法をユーザーに報告するのではなく、「False、False、False」と出力するだけです。

位置パラメータを追加すると、動作が変わることに気づきました。

Param(
    [switch] $A,
    [switch] $B,
    [switch] $C,
    [parameter(position=0)] $PositionalParameter
)
echo "A:$A, B:$B, C:$C"

ここで、「example2.ps1-asdf」を実行すると、ParameterBindingExceptionが発生します。ただし、「example2.ps1asdf」(先頭にダッシュがないパラメーターに注意)は引き続きサイレントに受け入れられます。

2つの質問があります:

  1. Powershellにスクリプトへの追加の引数を常にエラーとして報告させる方法はありますか?私のスクリプトでは、スイッチの固定セット(-A、-B、-C)を許可したいだけで、他のパラメーターはエラーになるはずです。

  2. パラメータエラーが検出された場合、ParameterBindingExceptionを発生させる代わりに、Powershellに使用法(つまり、「get-helpexample.ps1」)を出力させることはできますか?

4

2 に答える 2

5

about_Functions_CmdletBindingAttributeでCmdletBinding説明されているように、 CmdletBinding属性を持つ関数、不明なパラメーター、および一致する位置パラメーターを持たない位置引数を使用すると、パラメーターのバインドが失敗します。

[CmdletBinding()]
Param(
      [switch] $A,
      [switch] $B,
      [switch] $C)

echo "A:$A, B:$B, C:$C"
于 2012-06-30T16:24:26.067 に答える
2

このようにチェックしてみることができます$args

Function myfunction
{
  param(
        [switch] $A,
        [switch] $B,
        [switch] $C
)

foreach ( $key in $PSBoundParameters.keys )
{    
  if ( $args -gt 0) 
        {$script:test = $false ; break}
    else
        {$script:test = $true}
}    

if ($test)     
{ 
 "Parameters are ok" # ... your code script here
}    
else
{
  "Parameters error. Check Command" # or get-help myfuction
}
}
于 2012-06-29T21:18:17.820 に答える