質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

Q&A

解決済

2回答

3173閲覧

PowerShellスクリプトにオプションを追加する

kiritsukiR

総合スコア22

PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

0グッド

0クリップ

投稿2018/11/05 23:19

やりたいこと

以下のようなプログラムがあります。

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のコマンドの使い方ばかりが出てしまう)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

PowerShellの関数の仮引数の定義方法はいくつかありますが、詳細に動作を指定したい場合は関数本文内でparam()を使って定義する必要があります。

今回は質問のsample2をベースに$argumentsパラメータに各種属性を指定することで、希望と思われる動作とすることが出来ました。

各種属性は公式のヘルプである以下のページを参照して記述しました。

about_Functions_Advanced_Parameters | Microsoft Docs

(PowerShellの概念・機能の説明はabout_~からはじまるヘルプトピックに記載されています)

powershell

1function sample3 { 2 param( 3 [switch]$flag, 4 5 # 位置を明示・特に指定されないすべての引数を取得 6 [parameter(Position=0,ValueFromRemainingArguments=$true)] 7 [array]$arguments, 8 9 [string]$value 10 ) 11 12 Write-Output flag:$flag 13 Write-Output value:$value 14 Write-Output arguments:$arguments 15 Write-Output args:$args 16 Write-Host 17}

確認に使ったスクリプト

powershell

1'sample3 u1 u2 u3' 2sample3 u1 u2 u3 3<# 4flag:False 5value: 6args:u1 u2 u3 7#> 8 9'sample3 -flag u1 u2 u3' 10sample3 -flag u1 u2 u3 11<# 12flag:True 13value: 14args: u1 u2 u3 15#> 16 17'sample3 -value v u1 u2 u3' 18sample3 -value v u1 u2 u3 19<# 20flag:False 21value:v 22args:u1 u2 u3 23#> 24 25'sample3 -flag -value v u1 u2 u3' 26sample3 -flag -value v u1 u2 u3 27<# 28flag:True 29value:v 30args:u1 u2 u3 31#>

結果

sample3 u1 u2 u3 flag:False value: arguments:u1 u2 u3 args: sample3 -flag u1 u2 u3 flag:True value: arguments:u1 u2 u3 args: sample3 -value v u1 u2 u3 flag:False value:v arguments:u1 u2 u3 args: sample3 -flag -value v u1 u2 u3 flag:True value:v arguments:u1 u2 u3 args:

投稿2018/11/06 12:17

imihito

総合スコア2166

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kiritsukiR

2018/11/07 03:26

回答ありがとうございます。 無事に引数を取ることができました。
guest

0

$args に引数が順番に格納されてるので、それ見て振り分ければいいんじゃ

投稿2018/11/06 00:15

y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問