この連載では、Microsoftが提供している新しいシェル、Windows Power Shellの使い方を解説します。今回は、関數の作成基礎と引數、戻り値、Switchパラメータについて説明します。
はじめに
この連載では、Microsoftが提供している新しいシェル、Windows Power Shellの使い方を解説します。今回は、関數の作成基礎と引數、戻り値、Switchパラメータについて説明します。
対象読者
- Windows PowerShellでコマンドレット操作ができる方
- 何らかのプログラミング経験があればなお良い
必要環境
- Windows PowerShell
関數の基礎
PowerShellでの関數の基本構文は、
function 関數名 { 処理內容 }
です。このようにして作成した関數は、
関數名[Enter]
と入力して呼び出します。
早速ですが関數を1つ作成してみましょう。コンソールウィンドウで下記のように入力してください。
PS > function Hello { >> Write-Host "Hello PowerShell World!!" >> } >>
上記は関數名がHello
で、呼び出されたらWrite-Host
コマンドレットを使用して"Hello PowerShell World!!"と表示するものです。
では実際にHello
関數を使用してみましょう。コマンドラインでHelloと入力し、[Enter]キーを押下してください。
PS > Hello Hello PowerShell World!!
関數が実行され、"Hello PowerShell World!!"と表示されます。
引數
引數のある関數
引數のある関數の構文は、
function 関數名 (引數1, 引數2, ...引數n) { 処理內容 }
またはparam
キーワードを使用して、
function 関數名 { Param(引數1, 引數2, ...引數n) }
と書きます。この連載では前者の方で説明していきます。
引數のある関數の例として、足し算をする関數add
を作成してみましょう。
PS > function add ($x, $y) >> { >> Write-Host ($x + $y) >> } >>
この関數は引數$x
と$y
の2つを持っています。このように複數の引數を持つ関數を実行する場合は、
PS > add 3 5
のようにし、引數に渡す値はスペースで區切ります。
実はこの関數は、
PS > add Code Zine CodeZine
のように引數に文字列を渡すこともできます。これは引數に型が指定されていないためです。また加算演算子+
は文字列の場合は連結を行うため、上記は"CodeZine"と表示されます。
引數の型指定
先ほどの関數add
では、引數の型が指定されていませんでした。今度は、引數に型を指定してみましょう。
PS > function add2 ([int]$x, [int]$y) >> { >> Write-Host ($x + $y) >> } >>
引數に型を指定するには、上記[int]
のように[型]
を引數の前に記述します。ここでは、関數add2
の引數の型を[int]
としました。
この関數に文字列を渡したらどうなるでしょうか?
PS > add2 Code Zine add2 : 値 "Code" を型 "System.Int32" に変換できません。エラー: "入力文字列の形式が正しく ありません。" 発生場所 行:1 文字:5 + add2 <<<< Code Zine
引數に型指定([int]
)を行ったため、文字列は受け取ることができずエラーとなります。
引數の初期値
引數には初期値を與えることが可能です。引數を省略して関數が呼び出された場合に、あらかじめ與えておいた初期値が使用されます。
初期値を與えるには引數を、
変數 = 値
のように記述します。
下記は引數$favorite
に"CodeZine"を與えています。
PS > function MyFavorite ($favorite="CodeZine") { >> Write-Host ("My favorite is $favorite") >> }
関數名のみで呼び出すと、
PS > MyFavorite My favorite is CodeZine
となり、初期値が変數にセットされることが分かります。
先ほどは引數の初期値に定數を與えましたが、式を與えることも可能です。
PS > function Get-Year ([DateTime]$ymd = $(Get-Date)) { >> Write-Host $ymd.Year >> } >>
上記の関數Get-Year
は受け取った引數(年月日)の年のみを表示する関數です。引數が省略された場合は、Get-Date
コマンドレットの結果(実行したときの年月日)が$ymd
の初期値となります。
暗黙の引數
ここまでの引數の例は、どのような値をいくつ受け取るかを事前に指定しています。
PowerShellには$args
という自動変數があり、明示的に引數を指定していない関數でも値を受け取ることができます。例として引數のない関數Hello2
を作成して$args
の動作を確認したいと思います。
PS > function Hello2 { >> Write-Host ("こんにちは" + $args + "さん") >> } >>
入力が完了したら次のように実行してみましょう。
PS > Hello2 CodeZine こんにちはCodeZineさん
このように明示的な引數がなくても値を受け取ることができます。
また、$args
変數は複數の値を受け取ることができます。関數へ複數の値を渡す場合は、値をスペースで區切ります。
PS > function Test-Args { >> foreach ( $val in $args ) >> { >> Write-Host $val >> } >> } >>
上記は受け取った引數すべてを表示するというものです。
試しに
PS > Test-Args "A" "B" "C"
と入力してみてください。
PS > Test-Args "A" "B" "C" A B C
となり、3つの値を$args
変數が受け取っていることを確認できます。
$Args
以外にも多くの自動変數があります。興味のある方はコマンドラインで
help about_automatic_variables | more
參照渡し
參照渡しをするには、引數の前に[ref]
を付けます。
また、関數內部では參照渡しで受け取った値は、
$変數名.value
として使用する必要があります。
下記は、參照渡しのの引數$x
と値渡しの引數$y
を持つ関數です。この関數は、內部で受け取った引數の値を數値の5で上書きするというものです。
PS > function Test-Ref([ref]$x, $y) >> { >> $x.value = 5 >> $y = 5 >> } >>
この関數を実行したらどうなるか実験してみましょう。
まず、変數$x
と$y
を準備し、初期値として1を代入しておきます。次に、関數Test-Ref
を実行するのですが、參照渡しの引數の書き方に注意が必要です。([ref]変數名)
のように記述する必要があります。
PS > $x = 1 PS > $y = 1 PS > Test-Ref ([ref]$x) $y
では、この関數の実行結果はどうなったかを確認します。
PS > $x, $y PS > 5 PS > 1
參照渡しである$x
は"5"に書き換わり、$y
は関數実行前の値"1"が格納されています。
戻り値
戻り値を設定するにはreturn
キーワードを使用します。
下記は、引數で受け取った2つの値を足し算してreturn
で返します。
PS > function Add3 ([int]$x, [int]$y) >> { >> return $x + $y >> } >>
return
で返される値は、下記のようにして変數に代入することができます。
PS > $ret = Add3 3 4
この場合は$ret
に3 + 4の結果が代入されます。
引數の位置指定
関數呼び出し時に引數名を指定すると、引數の順番を変更することができます。
下記はBMIを計算する関數です。
PS > function BMI($weight, $height) { >> return $weight / [math]::pow($height,2) >> } >>
関數の呼び出しを、
PS> BMI 65 1.75
とした場合は、體重が65kg、身長が1.75mのBMIを求めることになり、結果として21.2244897959184という値が返されます。
これを
PS > BMI -height 1.75 -weight 65
として実行しても同じ結果が返されます。これは、関數呼び出し時に、引數height
には1.75、weight
には65を渡すことを明示的に指定しているからです。
このようにPowerShellでは、どの引數に何の値を渡すかを指定することで、引數の順番を変更することが可能です。
BMIは 體重(kg)÷(身長(m)*身長(m)) で求めることができます。
ちなみにBMI 25以上が肥満、22が標準、18以下がやせ です
switchパラメータ
switch
パラメータとは、その名の通りスイッチのような役割をする引數です。
PS > function Say-Hello ([switch]$help) >> { >> if ( $help ) >> { >> Write-Host "これはSay-Hello関數の説明です" >> } >> else >> { >> Write-Host "Hello!!" >> } >> }
この関數を、
PS > Say-Hello -help
として呼び出すと、「これはSay-Hello関數の説明です」と表示されます。これは、関數Say-Hello
にスイッチ-help
を指定すると、$help
にTrueの値がセットされるためです。
このようにswitch
パラメータは、引數に値を渡さずに、パラメータの指定によって処理內容を分岐させたいときに有効です。
まとめ
今回は、次の內容について解説しました。
- 関數の基礎
- 引數の使い方
- 戻り値
switch
パラメータ
今回の説明ではコンソールウィンドウで関數を作成しました。次回は関數をファイルとして作成し、利用する方法について解説したいと思います。