Warning: preg_match(): Compilation failed: unrecognized character follows \ at offset 1 in /home/r5652521/public_html/soma-engineering.com/wp-content/themes/affinger/functions.php on line 1548
Warning: preg_match(): Compilation failed: unrecognized character follows \ at offset 1 in /home/r5652521/public_html/soma-engineering.com/wp-content/themes/affinger/functions.php on line 1548
Warning: preg_match(): Compilation failed: unrecognized character follows \ at offset 1 in /home/r5652521/public_html/soma-engineering.com/wp-content/themes/affinger/functions.php on line 1548
Warning: preg_match(): Compilation failed: unrecognized character follows \ at offset 1 in /home/r5652521/public_html/soma-engineering.com/wp-content/themes/affinger/functions.php on line 1548
Warning: preg_match(): Compilation failed: unrecognized character follows \ at offset 1 in /home/r5652521/public_html/soma-engineering.com/wp-content/themes/affinger/functions.php on line 1548
こんにちは!そーまんです。
今回は、PowerShell での関数とは何か、関数の書き方、またどう使うかについて説明いたします。
関数とは何か
私もそうですが PowerShell を書き始めた時には、恐らく PowerShell のモジュール化(部品化)だとか、再利用化などは考慮に入れていないかと思います。(そもそもそれ自体が何かさえも分からないいかもしれません。)
PowerShell のスクリプトの中で何度も使われる処理がある際、そこでスクリプトの量が増えてゆくとコードの量が多ければ多いほど保守するのが面倒になってくると思います。例えば、エラー処理毎にログの処理を書いているスクリプトをリリースした場合とかです。その後にログの処理を変更する事になった場合、ログの処理を書いた分全てを修正しなければいけない為になります。
これは労力が要りますし、時間の無駄でもあり、一部のログの内容を修正しわすれてしまって処理が失敗してしまったという人的ミスになりかねません。これは避けたいところですよね。
このように、処理を再利用しなければならない場合は関数化してしまえば 1 つの処理内容だけメンテナンスすれば良くなりますので効率的です。そこで関数の登場です。
関数を使うメリット
PowerShell の関数は繰り返し使われる処理をモジュール化として、再利用できるようにすれば、主に以下の 3 つのメリットがあります。
メリット
- 再利用可能:スクリプト(関数)の使い回しができる
- 可読性が上がる:スクリプトが読みやすくなる。(同じ処理が一気に減る為。)
- 保守性が上がる:変更箇所が少なくなる
処理内容が小さければ、わざわざ関数を使う必要はないと思いますが、処理内容が膨大になってくると、関数を使わないと手に負えなくなってくるわけです。
関数の書き方
それでは関数を書いてみましょう。まずは関数を設定するところから始めます。
構文
関数の名前を割り当てます。関数を実行する時に関数名を指定します。構文としては以下のようになります。関数名は Save-Log のように動詞-名詞のように書きますが、単語だけでも問題ないと思います。例えば Log とかです。
1 2 3 4 5 6 7 |
function 関数名 { 宣言 1 宣言 2 } |
サンプル①
実際にイメージが湧かないので、サンプルを書いてみました。下に書いてある関数 Add-Numbers を読み込んだ後に、関数を呼び出して、処理する流れになります。10 は配列のインデックス 0 番目、100 は配列のインデックス 1 番目に入り、それを合計した値が実行結果に表示されます。
1 2 3 4 5 6 7 8 9 10 11 12 |
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) が書いてあります。
- 関数 Say-Hello を作ります。処理では関数の引数である $names を、foreach 文で中身が無くなるまで 1 つずつ取り出し、echo で $name を表示します。
- $names に 4 人の名前を代入します。
- Say-Hello 関数を実行しています。引数として使う $names をここで書いてあげます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
function Say-Hello($names) { foreach ($name in $names) { echo "こんにちは皆さん!私は $name です。" } } $names=@("Ichiro","Jiro","Saburo","Shiro") Say-Hello $names # 実行結果 こんにちは皆さん!私は Ichiro です。 こんにちは皆さん!私は Jiro です。 こんにちは皆さん!私は Saburo です。 こんにちは皆さん!私は Shiro です。 |
サンプル③
また別のサンプルを書いてみました。これは関数の使い方に慣れていないと理解がやや難しいので難しいと感じたらパスしてもらって大丈夫です。
- 関数 Say-Hello では、1 つ目の引数 $names と 2 つ目の引数 $greeting ($hi) を持ってきます。
- $names は、foreach 文で中身が無くなるまで 1 つずつ取り出され、echo で $name を表示する処理を作ります。
- $greeting は Write-Output で表示する処理を作ります。
- $names に 4 人の名前を代入します。
- Say-Hello 関数を実行しています。引数として使う $names と $hi で処理をします。
- 最初に「こんにちは!私は〇〇〇です。」のループ処理を実行します。
- ループ処理が完了したら、$hi を呼び出して「お元気ですか?」を実行します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
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 の場合は -(ハイフン)を使います。
- 関数 Self-Introduction では、以下の処理を作ります。
- param に $name(名前) と $job (職業) と $age (年齢) を、データ型と一緒に指定します。
- 名前と職業と年齢を含んだ自己紹介をWrite-Output で表示する処理を作ります。
- Self-Introduction 関数を実行しています。param で指定したキーワードを - を使い引数を設定します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
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 の関数と一緒に指定する引数が最初は分かりにくいのかなと思ったりします。
また、関数を実行する際に指定する引数についても分かりにくいと思います。これは慣れるしかないので、コードを書いて実行する事を繰り返しやっていけば理解できるようになりますので心配ないと思います。とにかく継続してスクリプトを書いてみましょう。
そうすれば、スクリプトの書き方も上達しますし、可読性の高い、保守性のある、つまり誰が見ても分かりやすいスクリプトが書けるようになるはずです。
それでは最後までお読みいただきありがとうございました!