2015年9月21日月曜日

Powershellの遊んでる引数

Windows 10でのPowershell 5.0環境で簡単スクリプト作成、等と考えていたらパラメータと引数で早々に転んだので備忘録。

こんなオプションと引数があるスクリプトを作る。
> 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
}
これの出力結果がこちら。
> &"Test.ps1" 1 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}

これでオプションを指定してカンマで区切る作業が省ける。
だいぶ前にスクリプトを作ったときはPositionとValueFromRemainingArgumentsを指定しないと、オプションがないとのことで例外が発生していたのだが、いつから動作が変わったのだろう。

0 件のコメント:

コメントを投稿