やりたいこと
以下のようなプログラムがあります。
PowerShell
1# 引数を受け取って何かをするプログラム 2function sample0 { 3 # サンプル用に引数の表示 4 Write-Output args:$args 5 6 # $argsに対して何かをする 7}
当然、引数にu1,u2,u3を与えると以下のようになります。
PS ***> sample0 u1 u2 u3 args:u1 u2 u3
このプログラムにいくつかのオプションを追加することを考えます。
ここでは値を取らないfalgと値を取るvalueの2つのオプションを取るとします。
つまり、以下のようにしたいです。
PS ***> sample u1 u2 u3 flag:False value: args:u1 u2 u3 PS ***> sample -flag u1 u2 u3 flag:True value: args: u1 u2 u3 PS ***> sample -value v u1 u2 u3 flag:False value:v args:u1 u2 u3 PS ***> sample -flag -value v u1 u2 u3 flag:True value:v args:u1 u2 u3
やったこと
引数の宣言
まずは、単純に引数として宣言しました。
PowerShell
1# 純粋にオプションを用意した 2function sample1([switch]$flag, [string]$value) { 3 Write-Output flag:$flag 4 Write-Output value:$value 5 Write-Output args:$args 6}
これを実行すると、以下のようにu1がvalueの値になってしまう場合がありました。
PS ***> sample1 u1 u2 u3 flag:False value:u1 # u1がvalueの値になってしまっている args:u2 u3 PS ***> sample1 -flag u1 u2 u3 flag:True value:u1 # u1がvalueの値になってしまっている args:u2 u3 PS ***> sample1 -value v u1 u2 u3 flag:False value:v args:u1 u2 u3 PS ***> sample1 -flag -value v u1 u2 u3 flag:True value:v args:u1 u2 u3
配列を追加
valueに奪われているようなのでその前に配列として受け取ってしまえばいい、と考え配列argumentsを先頭に追加しました。
PowerShell
1# 先頭にarrayを入れた 2function sample2([array]$arguments, [switch]$flag, [string]$value) { 3 Write-Output flag:$flag 4 Write-Output value:$value 5 Write-Output arguments:$arguments 6 Write-Output args:$args 7}
その結果、以下のように配列で渡すことで理想の挙動を得ることができました。
PS ***> sample2 u1, u2, u3 flag:False value: arguments:u1 u2 u3 args: PS ***> sample2 -flag u1, u2, u3 flag:True value: arguments:u1 u2 u3 args: PS ***> sample2 -value v u1, u2, u3 flag:False value:v arguments:u1 u2 u3 args: PS ***> sample2 -flag -value v u1, u2, u3 flag:True value:v arguments:u1 u2 u3 args:
目的は達成しています。
しかし、以前のように入力すると失敗してしまいます。
可能であればフォーマットは変えたくありません。
PS ***> sample2 u1 u2 u3 flag:False value:u2 arguments:u1 args:u3 PS ***> sample2 -flag u1 u2 u3 flag:True value:u2 arguments:u1 args:u3 PS ***> sample2 -value v u1 u2 u3 flag:False value:v arguments:u1 args:u2 u3 PS ***> sample2 -flag -value v u1 u2 u3 flag:True value:v arguments:u1 args:u2 u3
TL;DR
引数を宣言した順ではなく、-value v
のように変数名とともに値が与えられたときのみ変数に格納するようにするにはどうすればいいでしょうか。
そもそも"PowerShellらしい引数の取り方"でしょうか(bashのシェルスクリプトを書く方が多いので、PowerShellではこんな書き方はしない等のツッコミがあれば是非)
またURLを貼る場合はどのような検索キーワードで辿り着いたかも合わせてお願いします。(検索の仕方が下手なのか、PowerShellのコマンドの使い方ばかりが出てしまう)
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/11/07 03:26