こんなオプションと引数があるスクリプトを作る。
> COMMAND -OPTION A,B,C -OUTPUT D
上の形を、OPTIONオプション抜きで入力できる様にしたい。
> COMMAND A B C -OUTPUT D
このようにするために、ps1ファイル内でParamの設定を行う。ValueFromRemainingArguments=$trueにより、オプションのつけられていない引数は皆OPTIONに引き渡される。
引数まるまる表示の為の $PSBoundParameters もつけててテストファイルを作ってみる。
Test.ps1
Param(
[parameter(ValueFromRemainingArguments=$true)]$OPTION,
$OUTPUT
)
process{
$PSBoundParameters
}
これの出力結果がこちら。[parameter(ValueFromRemainingArguments=$true)]$OPTION,
$OUTPUT
)
process{
$PSBoundParameters
}
> &"Test.ps1" 1 2 3
Key Value
--- -----
OUTPUT 1
OPTION {2, 3}
Key Value
--- -----
OUTPUT 1
OPTION {2, 3}
$PSBoundParametersの力によりオプションと引数の組み合わせがよく分かる。
なぜかお呼びでないOUTPUTに値が割り振られており、ValueFromRemainingArgumentsが機能していない。ついでに引数の順序も訳が分からない並びだ。
ここでValueFromRemainingArgumentsを機能させるためにファイル先頭行に
[CmdletBinding(PositionalBinding=$false)]
を追加。CmdletBindingにより、このスクリプトは組み込みコマンド同様の「コマンドレット」として扱われる。引数の割り振りを行わないようにPositionalBindingを指定。
実行するとこうなる。
> &"Test.ps1" 1 2 3
Key Value
--- -----
OPTION {1, 2, 3}
Key Value
--- -----
OPTION {1, 2, 3}
これでオプションを指定してカンマで区切る作業が省ける。
だいぶ前にスクリプトを作ったときはPositionとValueFromRemainingArgumentsを指定しないと、オプションがないとのことで例外が発生していたのだが、いつから動作が変わったのだろう。