1

次のようなスクリプトがあります。

param(
  [Alias('a')]
  [string]$aval,
  [Alias('b')]
  [switch]$bval,
  [Alias('c')]
  [string]$cval
)

if($aval.length -gt 1)
{
  Do-Something
}
elseif($bval)
{
  Do-Something-Else
}
elseif($cval.length -gt 1)
{
  Do-Another-Thing
}
else
{
  Do-This
}

誰かが私のスクリプトをそのように呼び出すと、パラメータ 'aval/bval/cval' の引数が不足していることを示す醜いエラーが表示されます。

PS C:\> .\MyScript.ps1 -a
C:\MyScript.ps1 : Missing an argument for parameter 'aval'. Specify a
parameter of type 'System.String' and try again.
At line:1 char:18
+ .\MyScript.ps1 -n <<<<
    + CategoryInfo          : InvalidArgument: (:) [MyScript.ps1],    ParameterBindingException
    + FullyQualifiedErrorId : MissingArgument,MyScript.ps1

代わりに、よりクリーンな、おそらく 1 行のエラーを表示する方法はありますか? また、elseif ステートメントのリストよりもパラメーターを処理するためのより良い方法はありますか (実際のスクリプトには ~10 個のパラメーターがあります)。

スクリプトは、パラメーターとともに引数を渡す場合もあります。

EX:
PS C:\> .\MyScript.ps1 -b ServerName

助けてくれてありがとう!

4

1 に答える 1

0

ここで確認できることがいくつかあります。まず、パラメーターに関連付けられた値がなく、スクリプトがパラメーターで呼び出されたかどうかを知りたいだけの場合は、文字列の代わりに [switch] パラメーターを使用します。

スイッチ パラメータを使用した非常に簡単な例を次に示します。

param(
        [switch]$a
     )

if($a){
    'Switch was present'
}else{
    'No switch present'
}

これをスクリプトとして保存し、-a パラメーターを指定して、または指定せずに実行します。

ある値が渡されたパラメーターが存在する場合と、値が渡されない場合がある場合は、パラメーターを定義するときにデフォルト値を指定します。

[Alias('a')]
[string]$aval = '',

次に、ロジックで何かが渡された場合、文字列の長さは gt 1 になります。

あなたが持っているif-then構造に関しては、この種のロジックを処理するためのオプションがたくさんあります。あなたが共有した少しの情報で、スイッチ構造を使用することが最善の計画になると思います:

Get-Help about_Switch
于 2013-01-18T14:36:24.460 に答える