PowerShell

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

2018年7月1日

こんにちは!そーまんです。

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


関数とは何か

私もそうですが PowerShell を書き始めた時には、恐らく PowerShell のモジュール化(部品化)だとか、再利用化などは考慮に入れていないかと思います。(そもそもそれ自体が何かさえも分からないいかもしれません。)

PowerShell のスクリプトの中で何度も使われる処理がある際、そこでスクリプトの量が増えてゆくとコードの量が多ければ多いほど保守するのが面倒になってくると思います。例えば、エラー処理毎にログの処理を書いているスクリプトをリリースした場合とかです。その後にログの処理を変更する事になった場合、ログの処理を書いた分全てを修正しなければいけない為になります。

これは労力が要りますし、時間の無駄でもあり、一部のログの内容を修正しわすれてしまって処理が失敗してしまったという人的ミスになりかねません。これは避けたいところですよね。

このように、処理を再利用しなければならない場合は関数化してしまえば 1 つの処理内容だけメンテナンスすれば良くなりますので効率的です。そこで関数の登場です。


関数を使うメリット

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

メリット

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

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


関数の書き方

それでは関数を書いてみましょう。まずは関数を設定するところから始めます。

構文

関数の名前を割り当てます。関数を実行する時に関数名を指定します。構文としては以下のようになります。関数名は Save-Log のように動詞-名詞のように書きますが、単語だけでも問題ないと思います。例えば Log とかです。


サンプル①

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


サンプル②

別のサンプルも書いてみました。$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 をここで書いてあげます。


サンプル③

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

  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 を呼び出して「お元気ですか?」を実行します。


サンプル④

今度は関数に param を使い、自己紹介を指定してみました。今までは、関数名の後ろに ()カッコ で引数を記述していましたが、関数内に Param キーワードで記述する事もできます。

ここでは関数を呼び出す時に、param に入る値を書いてあげると、それに合わせて自己紹介が表示されます。今まで関数を実行する時に引数を設定する場合は、$(ドル)を使っていましたが、param の場合は -(ハイフン)を使います。

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


まとめ

以上になります。いかがでしょうか。

関数は慣れないとなかなか使いにくいと思います。function の関数と一緒に指定する引数が最初は分かりにくいのかなと思ったりします。

また、関数を実行する際に指定する引数についても分かりにくいと思います。これは慣れるしかないので、コードを書いて実行する事を繰り返しやっていけば理解できるようになりますので心配ないと思います。とにかく継続してスクリプトを書いてみましょう。

そうすれば、スクリプトの書き方も上達しますし、可読性の高い、保守性のある、つまり誰が見ても分かりやすいスクリプトが書けるようになるはずです。

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

  • この記事を書いた人

そーまん

セキュリティエンジニアやってます。
ブログ歴3年。PVは月15万PV程度。
趣味はボクシング、筋トレ、登山です。
穏やかで人見知りな性格です。

人気記事

1

こんにちは!そーまんです。 今回は、PC に適用されている GPO を確認する方法について書きました。 本題に入る前に、一応参考までにGPOの適用タイミングについての記事をここに貼りましたので、必要に ...

2

こんにちは!そーまんです。 今回は sysprep について、全体的に PC をセットアップする観点から書いてみました。長々と書いてあります。まずは前置きからです。 まずはじめに 組織では PC のラ ...

3

こんにちは!そーまんです。 今回は、グループポリシー (GPO) を使って、特定のコンピューターに対して、ドメインユーザーに ローカル管理者権限 (以下は特権と記載) を付与する方法について書きました ...

4

こんにちは!そーまんです。 今回は、Windows サインイン後に一時ユーザープロファイルが読み込まれてしまった場合の解決方法について書きました。 Windows 10 の検証環境をいじってたらサイン ...

5

こんにちは!そーまんです。 今回は、ユーザープロファイルを削除する方法について書いてみました。 企業の場合よくあることですが、1 台の PC を共有 PC として複数人で使ったり、また余り無いかもしれ ...

6

こんにちは!SE ブログの相馬です。       今回は、繰り返し文について書いてみました。PowerShell では他のプログラミング言語同様、繰り返し処理を行うことが ...

7

コマンドを使って CPU とメモリの使用率をデータで取得してみましたので、例えば PC のトラブルシューティングで問題を再現させる際にデータを取得しておくと、原因の特定に役立つ場合があるかと思います。

8

既存の PC と同じ構成で別のメーカーの PC でマスターイメージを作る際、インストールされているアプリを同一にする為に必要になるかと思います。

9

企業で多くの GPO が適用されている環境では、PC に GPO が適用されなかったりする問題が発生する場合があるかと思います。その中でも、コンピューターの構成またはユーザーの構成のどちらかで、...

10

こんにちは!そーまんです。 今回は、Windows Server 2019 で NTP サーバーと同期する方法について書きました。 NTP サーバーの必要性や時刻同期の重要性を理解することは社内のシス ...

-PowerShell
-