Powershell入門 - 10.関数

多くのプログラミング言語と同様に、Powershellにも関数という機能が存在しています。  
今回は、この関数を定義するための基本文法を学びます。

# 1. 関数の定義
他の言語を使ったことがある人にとっては今更ですが、関数とは「いくつかの処理をひとまとめにしたもの」で、一度定義しておくと何度でも使うことが出来ます。

関数を使いこなすには、**引数**と**戻り値**という重要な概念を理解する必要がありますが、まずは一番シンプルな引数なし、戻り値なしの関数の書き方から見ていきます。

## 1.1. 基本の関数の定義
引数なし、戻り値なしの関数は、以下のような構文で書きます。

```powershell
function 関数名() {
	処理
}
```

`function`というキーワードに続いて、関数名と括弧()を書きます。  
そして、波括弧{}内に、行いたい処理を書いていくという仕組みです。  

定義した関数を利用する場合は、単に`関数名`と書くことで呼び出すことが出来ます。  
他の言語を学んだ人は、つい`関数名()`と書きたくなりますが、我慢しましょう。

具体的な使用例は以下のようになります。

```powershell
function test(){
    Write-Host ("これは" + "テスト" + "です。")
}

test
test
test
```  
上記の処理を実行すると、"これはテストです。"という文字列が3行分表示されたと思います。  
このように、一度定義しておくと、何度でも使いまわして使えるのが関数のメリットです。

---

#### 例題1.
以下の処理をひとまとめにした関数reidai01を定義しなさい。
1. 現在のカレントディレクトリを`D:\powershell\data`に変更する(Set-Locationを使用)
2. 現在のカレントディレクトリを取得し、変数pathに格納(Get-Locationを使用)
3. 変数pathのフォルダの中身を表示する(Get-ChildItemを使用)

この処理を呼出して、実行結果を確認しなさい。

---

## 1.2. 引数ありの関数の定義
**引数**とは、関数に渡すことが出来る値です。  
渡した値は、関数内で自由に使用することが出来ます。
引数ありの関数の定義は、以下の通りです。

```powershell
function 関数名($引数1, $引数2, ・・・) {
	処理
}
```

あたらめて、先ほど定義したtest関数を見てみます。
```powershell
function test(){
    Write-Host ("これは" + "テスト" + "です。")
}
```

この関数は、いつどこで呼び出そうが"これはテストです。"という値を返します。  
この関数を引数に対応する形に書き換えます。

```powershell
function test($str){
    Write-Host ("これは" + $str + "です。")
}
```

引数$strは関数を呼び出すときに、一緒に渡すことが出来ます。
このようにすることで、呼び出しのタイミングで渡した引数によって結果を変えることが出来るようになります。

その呼び出し方ですが、`関数名 引数1 引数2 ・・・`という形で渡せます。  
この書き方も他の(多くの)プログラミング言語と違うので、注意しましょう。  

関数呼び出しまで含めたプログラムは以下の通りです。
```powershell
function test($str){
    Write-Host ("これは" + $str + "です。")
}

test "りんご"
test "みかん"
test "テスト"
```

---
#### 例題2.
以下の処理をひとまとめにした引数あり関数reidai02を定義しなさい。
引数は文字列を1つだけ受け取ることとする(引数名path)
1. 引数pathと文字列"sampleFolder2"を結合したパスを取得し、変数newPathに格納する(Join-Pathを使用)
2. そのパスが存在するかどうかを調べ、結果を変数resultに格納する(Test-Pathを使用)
3. 変数resultの値を表示する(Write-Hostを使用)

この処理を呼出して、実行結果を確認しなさい。
呼出時にわたす引数として、以下の3つを試すこと
- D:\
- D:\powershell\
- D:\powershell\data
---

## 1.3. 戻り値ありの関数の定義
**戻り値**とは、関数の呼び出し元に対して値の受け渡しが行える機能です。  
関数内で複雑な処理を行った結果を、メインの処理内で使いたい場合に使用します。

戻り値は、関数内で`return(戻り値)`と書いて使用します。
```powershell
function 関数名(){
    処理
    return(戻り値)
}
```

returnの処理が実行されると、**その時点で関数の処理は終了し、呼出し元に戻ります。**
それ以降に処理を書いても処理されませんので、注意しましょう。

```powershell
function 関数名(){
    処理1
    return(戻り値)
    処理2           # この処理は到達不可能
}
```

呼出し元では`$変数 = 関数名`と書くことで、関数の戻り値を受け取ることができます。
戻り値ありの関数の呼出し例は、以下の通りとなります。

```powershell
function test(){
    $a = 1..5
    $sum = 0
    foreach($el in $a){
        $sum += $el
    }
    return($sum)
}

$result = test
Write-Host $result
```

---
#### 例題3.
以下の処理をひとまとめにした引数あり関数reidai03を定義しなさい。
引数は文字列を1つだけ受け取ることとする(引数名path)
1. 引数pathと文字列"sampleFolder2"を結合したパスを取得し、変数newPathに格納する(Join-Pathを使用)
2. そのパスが存在するかどうかを調べ、結果を変数resultに格納する(Test-Pathを使用)
3. 変数resultの値を呼出し元に返却する。

この処理を呼出して、受け取った戻り値をWrite-Hostで表示しなさい。
呼出時にわたす引数として、以下の3つを試すこと
- D:\
- D:\powershell\
- D:\powershell\data

---

## 1.4. 関数のまとめ
専門学校の授業で関数を教えていると、引数と戻り値が分かりづらいという学生の話を聞きます。  
改めてそれぞれの違いを整理します。

- 引数 : 呼出し元から関数に値を渡すことが出来る (呼出し元 → 関数)
- 戻り値 : 関数から呼出し元に値を渡すことが出来る (関数 → 呼出し元)

どの言語でもこの仕組みは変わらないので、自分で関数を作る・呼び出すなどを繰り返して、関数に慣れていきましょう

Prev : [09. パイプライン](./53cb7275a044be3256aa)
Next : [11.プロセスの操作](./73421db2e8f2244bbc75)

[目次へ戻る](./926b8053a031539437a3)