パラメータには種類がある
前回はPowerShell Coreの機能として関数を取り上げるとともに、関数名の付け方と、関数に与える引数であるパラメータの使い方を紹介した。PowerShell Coreのコマンドレットはパラメータを指定することで挙動を変更することができる。これは関数でも同様だ。どのように書けばパラメータを使用できるのか、その基本を前回紹介した。
前回紹介したのは名前付きパラメータと呼ばれる機能で、たとえば「-Offset 10」のように、パラメータ名とその引数で構成されたパラメータだった。PowerShellではこれ以外に引数を取らないパラメータも指定できるし、そもそもパラメータではなく引数に値だけを列挙するといった使い方もできる。
今回はそうしたパラメータの使い方を紹介する。取り上げるのはポジションパラメータ、スイッチパラメータ、パラメータ渡しだ。
ポジションパラメータ
PowerShell Coreの関数では$args[インデックス]がポジションパラメータへのアクセスとして用意されている。インデックスは0からはじまる仕組みになっている。次の関数とその実行例を見ると、ポジションパラメータの使い方がよくわかると思う。
ポジションパラメータの使用例
PS /Users/daichi> function Do-PositionParaTest {
>> "第1引数: " + $args[0]
>> "第2引数: " + $args[1]
>> "第3引数: " + $args[2]
>> "第4引数: " + $args[3]
>> "第5引数: " + $args[4]
>> }
PS /Users/daichi> Do-PositionParaTest あ い う え お
第1引数: あ
第2引数: い
第3引数: う
第4引数: え
第5引数: お
PS /Users/daichi> Do-PositionParaTest あ い う え
第1引数: あ
第2引数: い
第3引数: う
第4引数: え
第5引数:
PS /Users/daichi> Do-PositionParaTest あ い う
第1引数: あ
第2引数: い
第3引数: う
第4引数:
第5引数:
PS /Users/daichi> Do-PositionParaTest あ い
第1引数: あ
第2引数: い
第3引数:
第4引数:
第5引数:
PS /Users/daichi> Do-PositionParaTest あ
第1引数: あ
第2引数:
第3引数:
第4引数:
第5引数:
PS /Users/daichi> Do-PositionParaTest
第1引数:
第2引数:
第3引数:
第4引数:
第5引数:
PS /Users/daichi>
名前付きパラメータを定義せずに名前付きパラメータを指定すると、次のように指定された順番のままポジションパラメータでアクセスすることができる。
名前付きパラメータを定義せずにポジションパラメータを使った場合
PS /Users/daichi> function Do-PositionParaTest {
>> "第1引数: " + $args[0]
>> "第2引数: " + $args[1]
>> "第3引数: " + $args[2]
>> "第4引数: " + $args[3]
>> "第5引数: " + $args[4]
>> }
PS /Users/daichi> Do-PositionParaTest -Offset 10
第1引数: -Offset
第2引数: 10
第3引数:
第4引数:
第5引数:
PS /Users/daichi>
名前付きパラメータを定義すると、次のように名前付きパラメータとポジションパラメータを別のものとして扱うことができるようになる。次のサンプルを見てみよう。
名前付きパラメータを定義しつつポジションパラメータを使った場合
PS /Users/daichi> function Do-PositionParaTest {
>> Param($Offset=1)
>> "Offset: " + $Offset
>> "第1引数: " + $args[0]
>> "第2引数: " + $args[1]
>> "第3引数: " + $args[2]
>> "第4引数: " + $args[3]
>> "第5引数: " + $args[4]
>> }
PS /Users/daichi> Do-PositionParaTest -Offset 10
Offset: 10
第1引数:
第2引数:
第3引数:
第4引数:
第5引数:
PS /Users/daichi> Do-PositionParaTest -Offset 10 あ い う え お
Offset: 10
第1引数: あ
第2引数: い
第3引数: う
第4引数: え
第5引数: お
PS /Users/daichi> Do-PositionParaTest -Offset 10 あ い う え
Offset: 10
第1引数: あ
第2引数: い
第3引数: う
第4引数: え
第5引数:
PS /Users/daichi> Do-PositionParaTest -Offset 10 あ い う
Offset: 10
第1引数: あ
第2引数: い
第3引数: う
第4引数:
第5引数:
PS /Users/daichi> Do-PositionParaTest -Offset 10 あ い
Offset: 10
第1引数: あ
第2引数: い
第3引数:
第4引数:
第5引数:
PS /Users/daichi> Do-PositionParaTest -Offset 10 あ
Offset: 10
第1引数: あ
第2引数:
第3引数:
第4引数:
第5引数:
PS /Users/daichi> Do-PositionParaTest -Offset 10
Offset: 10
第1引数:
第2引数:
第3引数:
第4引数:
第5引数:
PS /Users/daichi>
名前付きパラメータを定義した場合、定義された名前付きパラメータはポジションパラメータの対象として含まれていないことがわかる。つまり、名前付きパラメータとポジションパラメータは併用することもできる。
スイッチパラメータ
名前付きパラメータと似ているが、基本的に引数を取らないものはスイッチパラメータと呼ばれている。機能を有効にするとか無効にするとか、指定するだけで意味を持つタイプのパラメータだ。スイッチパラメータは定義するときに[switch]を指定することで定義することができる。
たとえば次のコードは-verboseというパラメータを使用できるようにしたものだ。-verboseが指定されれば$verboseは$trueと同じ意味になる。
スイッチパラメータの使い方
PS /Users/daichi> function Do-SwitchParaTest {
>> Param ([switch]$verbose)
>>
>> if ($verbose) {
>> "verbose mode on"
>> } else {
>> "verbose mode off"
>> }
>> }
PS /Users/daichi> Do-SwitchParaTest
verbose mode off
PS /Users/daichi> Do-SwitchParaTest -verbose
verbose mode on
PS /Users/daichi> Do-SwitchParaTest -verbose:$true
verbose mode on
PS /Users/daichi> Do-SwitchParaTest -verbose:$false
verbose mode off
PS /Users/daichi>
前回も説明したが、パラメータはParam()で定義することもできるし、次のように関数名のあとに指定することもできる。
関数名の後にスイッチパラメータを指定した場合
PS /Users/daichi> function Do-SwitchParaTest([switch]$verbose) {
>> if ($verbose) {
>> "verbose mode on"
>> } else {
>> "verbose mode off"
>> }
>> }
PS /Users/daichi> Do-SwitchParaTest
verbose mode off
PS /Users/daichi> Do-SwitchParaTest -verbose
verbose mode on
PS /Users/daichi> Do-SwitchParaTest -verbose:$true
verbose mode on
PS /Users/daichi> Do-SwitchParaTest -verbose:$false
verbose mode off
PS /Users/daichi>
スイッチパラメータは値を取らないが、-verbose:$trueのように明示的に値を指定することもできる。-verbose:$trueまたは-verbose:$falseのように指定する。
パラメータ渡し
パラメータの使い方とはちょっと違うのだが、PowerShell Coreではパラメータをそのまま別のコマンドレットや関数に渡すことができる。次のサンプルを見てみよう。
パラメータ渡しのサンプル
PS /Users/daichi> function Do-PositionParaTest {
>> "第1引数: " + $args[0]
>> "第2引数: " + $args[1]
>> "第3引数: " + $args[2]
>> "第4引数: " + $args[3]
>> "第5引数: " + $args[4]
>> }
PS /Users/daichi> function Do-ArgsTest {
>> Do-PositionParaTest @Args
>> }
PS /Users/daichi> Do-ArgsTest あ い う え お
第1引数: あ
第2引数: い
第3引数: う
第4引数: え
第5引数: お
PS /Users/daichi> Do-ArgsTest あ い う え
第1引数: あ
第2引数: い
第3引数: う
第4引数: え
第5引数:
PS /Users/daichi> Do-ArgsTest あ い う
第1引数: あ
第2引数: い
第3引数: う
第4引数:
第5引数:
PS /Users/daichi> Do-ArgsTest あ い
第1引数: あ
第2引数: い
第3引数:
第4引数:
第5引数:
PS /Users/daichi> Do-ArgsTest あ
第1引数: あ
第2引数:
第3引数:
第4引数:
第5引数:
PS /Users/daichi> Do-ArgsTest
第1引数:
第2引数:
第3引数:
第4引数:
第5引数:
PS /Users/daichi>
Do-ArgsTest関数に渡したパラメータが、そのままDo-PositionParaTest関数に渡されていることがわかるだろう。@Argsを使うことでこれを実現することができる。
これで関数で利用することができるパラメータ関連の機能はひととおり網羅したといったところだ。名前付きパラメータ、ポジションパラメータ、スイッチパラメータ、パラメータ渡し、このあたりを理解しておけばパラメータ周りでやりたいことはかなりできるようになるはずだ。