none
実行時の複数のスイッチの書式を、個別に評価したい RRS feed

  • 質問

  • こんにちは、Paramについて質問させてください。

    あるスクリプト testscript.ps1 を実行時、スイッチを付けるために、
    以下のように書きました。

    Param(  [switch]$local, [switch]$exclude, [switch]$command) 

    こうすることで

    testscript.ps1 -local
    testscript.ps1 -exclude
    testscript.ps1 -command

    といったスイッチの使い方が可能になっています。(if文で、オブジェクトが$Trueか$Falseかで処理を分岐させています)

    しかし、 -command スイッチにおいて、以下のような使い方をする必要性が生まれました。

    testscript.ps1 -command 2014 2015

    つまり-commandのスイッチが付いた場合は、
    その後ろには必ず二つの要素(-commandに対する引数的なもの(用語がわかりません))を書かなければいけないようにしたいのです。

    単にファイルに対する引数($ARGS[0]と$ARGS[1])を処理する方法では問題があって、たとえば、将来的に -excludeスイッチにおいても引数を1つ(たとえば、ファイル名)必要とする仕様になった場合で、かつ-excludeと-commandスイッチを併用した場合、コマンド実行時に入力する構文で、コードの書き方次第では、厳格な条件が必要になってくる可能性があります。

    こうした方法に頼らず、実現する方法があればご教示ください。

    2015年6月10日 4:45

回答

  •  Param([switch]$local, [switch]$exclude, [ValidateCount(2,2)][int[]]$command) 

    のように、[switch]ではなく、パラメータに与える値の型を指定すると良いと思います。

    今回の場合、2014など数値を与えるようなので、int型を指定しています。(もし文字列ならstringです)

    また、複数値を受け取れるように、[int[]]としてintの配列型を指定しています。

    型の指定だけだと、パラメータ値として2個を超えていくつでも指定できてしまうので、2個の場合のみ実行するようにパラメータ検証属性[ValidateCount]を付与します。ValidateCountでは、パラメータ値の配列要素数を規定できます。指定方法は、[ValidateCount(最小値,最大値)]です。今回の場合は2要素固定なので、最小値、最大値ともに2を指定します。

    このようなparamを定義しておくと、

    testscript.ps1 -command 2014,2015

    のような呼び出し方が可能になると思います。-commandパラメータは配列値を取るようにしたので、値を,で繋げて指定します。

    将来的に-excludeの仕様を変更する場合でも、-commandの仕様はこのままで可能になると思います。

    ただ、同じパラメータ名のまま[switch]なパラメータを[int[]]とかの値を受け取るパラメータに変更するのは、コードの保守や利用者の利便性の観点などから好ましくないと思います。

    最初からパラメータの処理内容に対して適切なパラメータ名を付与しておけば、将来的にswitchパラメータを値を取るパラメータに変更する、ということはないのではないかと思います。switchパラメータはあくまで「指定すると何かの処理がオンになる」という意味ですので…。


    2015年6月10日 6:00
    モデレータ

すべての返信

  •  Param([switch]$local, [switch]$exclude, [ValidateCount(2,2)][int[]]$command) 

    のように、[switch]ではなく、パラメータに与える値の型を指定すると良いと思います。

    今回の場合、2014など数値を与えるようなので、int型を指定しています。(もし文字列ならstringです)

    また、複数値を受け取れるように、[int[]]としてintの配列型を指定しています。

    型の指定だけだと、パラメータ値として2個を超えていくつでも指定できてしまうので、2個の場合のみ実行するようにパラメータ検証属性[ValidateCount]を付与します。ValidateCountでは、パラメータ値の配列要素数を規定できます。指定方法は、[ValidateCount(最小値,最大値)]です。今回の場合は2要素固定なので、最小値、最大値ともに2を指定します。

    このようなparamを定義しておくと、

    testscript.ps1 -command 2014,2015

    のような呼び出し方が可能になると思います。-commandパラメータは配列値を取るようにしたので、値を,で繋げて指定します。

    将来的に-excludeの仕様を変更する場合でも、-commandの仕様はこのままで可能になると思います。

    ただ、同じパラメータ名のまま[switch]なパラメータを[int[]]とかの値を受け取るパラメータに変更するのは、コードの保守や利用者の利便性の観点などから好ましくないと思います。

    最初からパラメータの処理内容に対して適切なパラメータ名を付与しておけば、将来的にswitchパラメータを値を取るパラメータに変更する、ということはないのではないかと思います。switchパラメータはあくまで「指定すると何かの処理がオンになる」という意味ですので…。


    2015年6月10日 6:00
    モデレータ
  • 牟田口さま、ありがとうございました。頂いた例で、解決しております。

    switchパラメータの扱い方について認識を改め、やり方を再度考えてみます。

    2015年6月11日 2:00