関数 ポジションパラメータ、スイッチパラメータ、パラメータ渡し

【連載】

PowerShell Core入門 - 基本コマンドの使い方

【第39回】関数 ポジションパラメータ、スイッチパラメータ、パラメータ渡し

[2019/02/21 07:00]後藤大地 ブックマーク ブックマーク

  • サーバ/ストレージ

サーバ/ストレージ

パラメータには種類がある

前回は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を使うことでこれを実現することができる。

これで関数で利用することができるパラメータ関連の機能はひととおり網羅したといったところだ。名前付きパラメータ、ポジションパラメータ、スイッチパラメータ、パラメータ渡し、このあたりを理解しておけばパラメータ周りでやりたいことはかなりできるようになるはずだ。

参考資料

※ 本記事は掲載時点の情報であり、最新のものとは異なる場合がございます。予めご了承ください。

一覧はこちら

連載目次

もっと知りたい!こちらもオススメ

【連載】RPA入門 - ツールで学ぶ活用シーン

【連載】RPA入門 - ツールで学ぶ活用シーン

AIには、ルールベース、機械学習、深層学習(ディープラーニング)の3つのレベルがあり、レベルが上がるに連れてより高度な人工知能を実現しますが、AIのスピンオフという位置付けで、Digital Labor(仮想知的労働者)によるホワイトカラー業務の自動化を実現するRPAが注目されています。

関連リンク

この記事に興味を持ったら"いいね!"を Click
Facebook で IT Search+ の人気記事をお届けします

会員登録(無料)

注目の特集/連載
知りたい! カナコさん 皆で話そうAIのコト
教えてカナコさん! これならわかるAI入門
対話システムをつくろう! Python超入門
Kubernetes入門
AWSで作るクラウドネイティブアプリケーションの基本
ソフトウェア開発自動化入門
PowerShell Core入門
徹底研究! ハイブリッドクラウド
[解説動画] Googleアナリティクス入門講座
マイナビニュース スペシャルセミナー 講演レポート/当日講演資料 まとめ
セキュリティアワード特設ページ

一覧はこちら

今注目のIT用語の意味を事典でチェック!

一覧はこちら

ページの先頭に戻る