天天看點

Windows PowerShell 入門(6)-関數編1

この連載では、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

変數が受け取っていることを確認できます。

自動変數

 「自動変數」とは、Windows PowerShellによって自動的に設定される変數のこと。

$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

 BMI(ボディマス指數)は、體重と身長の関係から人の肥満度を表す指數です。

 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

    パラメータ

 今回の説明ではコンソールウィンドウで関數を作成しました。次回は関數をファイルとして作成し、利用する方法について解説したいと思います。

繼續閱讀