【2023年】これからブログを始める人へおすすめの書籍

Kissy

Powershellでの関数の書き方まとめ

作成: 更新:

こんばんわ、きっしーです。

今回は、Powershellでの関数の実装方法です。Powershellの関数は一般的なプログラミング言語とおもむきが異なり、シェルという側面があります。

Powershellでスクリプトを書いたことがる方はご存知だと思いますが、Powershellではコマンドレットを数珠つなぎにする、パイプラインという仕組みがあります。

ここでは、このパイプラインでも使える関数の実装方法について解説します。

パイプラインで使える関数テンプレート

パイプラインで使える関数の構文は以下のようになります。

function Do-MyFunction
{
  [OutputType([int])]
  [CmdletBinding()]
  
  Param (
    [Parameter(ValueFromPipeline=$true, ValueFromPipelineByPropertyName=$true, Mandatry=$true)]
    [string[]]
    $strs
	
	[switch]
	$Special
  )

  Begin
  {
    # 最初の1回だけ実行する処理
  }
  
  Process
  {
    # パイプラインで値を受け取る毎に実行する処理
  }

  End
  {
    # 最後の1回だけ実行する処理
  }
}

OutputType

関数の戻り値の型を指定します。指定しておくとパイプラインで関数を使ったときに、インテリセンスが動作するメリットがあります。

CmdletBinding

これを指定しておくと、以下のようなコマンドレット共通のオプションを使用できるようになります。

  • Verbose
  • Debug
  • WarningAction
  • WarningAction
  • ErrorAction
  • ErrorVariable
  • OutVariable
  • OutBuffer

Pparam

関数のパラメータを定義します。詳細なパラメータの定義方法については後述します。

Begin

関数が実行される際に最初の一回だけ実行されます。パイプラインから複数のオブジェクトが渡ってくる場合にも、最初の一回だけ実行されます。ここでは主に初期化などの前処理を実装します。

Process

関数のメイン処理です。パイプラインから複数のオブジェクトが渡ってくる場合、それぞれのオブジェクトに対してProcessブロックが実行されます。

End

関数が実行される際に最後の一回だけ実行されます。パイプラインから複数のオブジェクトが渡ってくる場合にも、最後の一回だけ実行されます。ここでは主に後処理を実装します。

後処理とはいっても、try-finalyfinalyのようにエラー時にも呼ばれる保証はありません。ですので、基本的に例外処理はProcessブロックのtry-catchで行うものと考えるべきです。

Endブロックにはもう一つの役割があります。それは、すべてのオブジェクトがそろわないと実行できない処理を実装するケースです。Sort-Objectのようなコマンドレットではすべてのオブジェクトがそろわないと、ソートの処理を実行できません。このような関数を実装する場合は、Endブロックにメイン処理を実装することになります。

関数パラメータの定義

関数パラメータの定義は基本的に、「型+変数」で定義します。それに加えParameter属性を指定することでより詳細にパラメータを定義することができるようになります。

  Param (
    [Parameter(ValueFromPipeline=$true, Mandatry=$true, Posision=1)]
    [string]
    $object
	
    [Parameter(ValueFromPipelineByPropertyName=$true, Mandatry=$true)]
    [string]
    $Name
    
	[switch]
	$Special
  )

ValueFromPipeLine

ValueFromPipeLine=$trueを指定すると、パイプラインから渡されたオブジェクトをパラメータとして使用します。上の例では$objectにパイプラインから渡されたオブジェクトが格納されます。

ValueFromPipeLineByPropertyName

ValueFromPipeLineByPropertyName=$trueを指定すると、パイプラインから渡されたオブジェクトのプロパティと関数パラメータをバインドします。上の例では$Nameにパイプラインから渡されたオブジェクトのNameプロパティが格納されます。

Mandatry

そのパラメータが必須かどうかを指定します。$trueであれば必須、$falseであればオプションということになります。

Position

そのパラメータが第○引数かを指定します。Positionが指定されているパラメータでは、関数呼び出し時にパラメータ名称の指定を省略できるメリットがあります。

スイッチパラメータ

[switch]を指定すると、そのパラメータはスイッチパラメータとなります。スイッチパラメータは関数呼び出し時に、パラメータの指定があれば$true、パラメータの指定がなければ$falseという振る舞いをします。内部の動作を切り替えるスイッチとして利用します。

参考サイト

まとめ

パイプラインでも使える関数のテンプレートと、定義方法についてまとめました。パイプラインの仕組みをうまく使えば再利用可能なスクリプトが組めるようになります。関数を実装する場合は、パイプラインにも対応してみてください。

追伸:
「Windows Powershell IDE」で「Ctrl+J」を入力すると、基本的なPowershellの構文テンプレートを入力してくれることに、いまさらながら気づきました。

Ctrl+Jで関数テンプレートを入力する

「Ctrl+J」でテンプレートを選べるので、「Cmdlet (高度な関数)」や「Cmdlet (高度な関数) - 完了」を選べばテンプレートを入力してくれます。

最後まで読んでいただきありがとうございます。
また読んでくださいませ。
そんじゃーね。

関連記事

SPONSORED LINK
SPONSORED LINK