SEブログ

【PowerShell】関数(function)を使ってみる

 

こんにちは!SE ブログの相馬です。

 

 

今回は、関数とは何か、関数の書き方、またどう使うかについて説明いたします。

 

 

 

関数とは何か

 

 

あなたが PowerShell を書き始めた時には、恐らく PowerShell のモジュール化(部品化)だとか、再利用化などは考慮に入れていないと思います。(そもそもそれ自体が何かさえも分からないいかもしれません。)でもコードの量が増えてゆくにつれて、ある時、あなたが同じコードを繰り返し書いていれば気付くと思います。コードの量が多ければ多いほどそれに気付くはずです。同じ処理をコピペして繰り返し使っていると、そのうち保守するのが面倒になってくると思います。

 

 

同じ処理なら再利用可能な方法ってないかな?と思いますよね。そこで関数の登場です。

 

 

PowerShell の関数は繰り返し使われる処理をモジュール化として、再利用できるようにすれば、主に以下の 3 つのメリットがあります。

 

  • 再利用可能:コード(関数)の使い回しができる
  • 可読性が上がる:プログラムが読みやすくなる。(同じ処理のコードが一気に減る為。)
  • 保守性が上がる:変更箇所が少なくなる

 

 

処理内容が小さければ、わざわざ関数を使う必要はないと思いますが、処理内容が膨大になってくると、関数を使わないと手に負えなくなってくるわけです。

 

 

 

関数の書き方

 

 

構文

 

 

あなたが関数の名前を割り当てます。関数を実行する時に関数名を指定します。構文としては以下のようになります。関数名は動詞-名詞のように書きます。

 


function 関数名 {

    宣言 1

    宣言 2

}

 

 

 

サンプル①

 

 

実際にイメージが湧かないので、サンプルを書いてみました。下に書いてある関数 Add-Numbers を読み込んだ後に、関数を呼び出して、処理する流れになります。10 は配列のインデックス 0 番目、100 は配列のインデックス 1 番目に入り、それを合計した値が実行結果に表示されます。

 

function Add-Numbers {

    $total = $args[0] + $args[1]
    Write-Output "合計: $total"

}

Add-Numbers 10 100

# 実行結果

合計: 110

 

 

 

サンプル②

 

 

別のサンプルも書いてみました。$names 変数に名前を代入してあげて、foreach 文で連想配列から中身がなくなるまで全て取り出して個々の名前を表示する方法です。

代入する $names は、function Say-Hello の引数として設定します。ですので function Say-Hello の後に ($names) が書いてあります。

 

  1. 関数 Say-Hello を作ります。処理では関数の引数である $names を、foreach 文で中身が無くなるまで 1 つずつ取り出し、echo で $name を表示します。
  2. $names に 4 人の名前を代入します。
  3. Say-Hello 関数を実行しています。引数として使う $names をここで書いてあげます。

 

 

function Say-Hello($names) {

    foreach ($name in $names) {
        echo "こんにちは皆さん!私は $name です。"
    }
}

$names=@("Ichiro","Jiro","Saburo","Shiro")

Say-Hello $names


# 実行結果

こんにちは皆さん!私は Ichiro です。
こんにちは皆さん!私は Jiro です。
こんにちは皆さん!私は Saburo です。
こんにちは皆さん!私は Shiro です。

 

 

 

サンプル③

 

 

また別のサンプルを書いてみました。これは関数の使い方に慣れていないと理解がやや難しいので難しいと感じたらパスしてもらって大丈夫です。

 

  1. 関数 Say-Hello では、1 つ目の引数 $names と 2 つ目の引数 $greeting ($hi) を持ってきます。
    • $names は、foreach 文で中身が無くなるまで 1 つずつ取り出され、echo で $name を表示する処理を作ります。
    • $greeting は Write-Output で表示する処理を作ります。
  2. $names に 4 人の名前を代入します。
  3. Say-Hello 関数を実行しています。引数として使う $names と $hi で処理をします。
    • 最初に「こんにちは!私は〇〇〇です。」のループ処理を実行します。
    • ループ処理が完了したら、$hi を呼び出して「お元気ですか?」を実行します。

 

function Say-Hello ($names, $greeting) {

    foreach ($name in $names) {
        Write-Output "こんにちは!私は $name です。"
    }

    Write-Output $greeting

}

$names=@("Ichiro","Jiro","Saburo","Shiro")
$hi = "お元気ですか?"

Say-Hello $names $hi


# 実行結果

こんにちは!私は Ichiro です。
こんにちは!私は Jiro です。
こんにちは!私は Saburo です。
こんにちは!私は Shiro です。
お元気ですか?

 

 

 

サンプル④

 

 

今度は関数に param を使い、自己紹介を指定してみました。

今までは、関数名の後ろに ()カッコ で引数を記述していましたが、関数内に Param キーワードで記述する事もできます。

ここでは関数を呼び出す時に、param に入る値を書いてあげると、それに合わせて自己紹介が表示されます。

今まで関数を実行する時に引数を設定する場合は、$(ドル)を使っていましたが、param の場合は -(ハイフン)を使います。

 

 

  1. 関数 Self-Introduction では、以下の処理を作ります。
    • param に $name(名前) と $job (職業) と $age (年齢) を、データ型と一緒に指定します。
    • 名前と職業と年齢を含んだ自己紹介をWrite-Output で表示する処理を作ります。
  2. Self-Introduction 関数を実行しています。param で指定したキーワードを – を使い引数を設定します。

 

 

function Self-Introduction {

    param (
        [string]$name,
        [string]$job,
        [int]$age
    )

    Write-Output "皆さんこんにちは!私は $name です。$job をしています。$age 才です。"

}

self-introduction -name "Ichiro" -job "学生" -age 18
self-introduction -name "Jiro" -job "フリーター" -age 24
self-introduction -name "Saburo" -job "会社員" -age 30
self-introduction -name "Shiro" -job "主夫" -age 40


# 実行結果

皆さんこんにちは!私は Ichiro です。学生 をしています。18 才です。
皆さんこんにちは!私は Jiro です。フリーター をしています。24 才です。
皆さんこんにちは!私は Saburo です。会社員 をしています。30 才です。
皆さんこんにちは!私は Shiro です。主夫 をしています。40 才です。

 

 

まとめ

 

 

以上になります。いかがでしょうか。関数は慣れないとなかなか使えないと思います。function の関数と一緒に指定する引数が最初は分かりにくいのかなと思ったりします。あと、関数を実行する際に指定する引数についても分かりにくいと思います。これは慣れるしかないので、コードを書いて実行する事を繰り返しやっていけば理解できるようになりますので心配ないと思います。

 

 

それでは最後までお読みいただきありがとうございました!