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-finaly
のfinaly
のようにエラー時にも呼ばれる保証はありません。ですので、基本的に例外処理は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: 高度な関数のライフサイクル - TechNet - Microsoft ](https://technet.microsoft.com/ja-jp/library/hh413265.aspx)
- 関数のライフサイクルについて記載されています。
-
【PowerShell】MVA対策講座 Windows PowerShell 3.0 を基礎から学ぶ ‐ Part4 高度な関数 編
- 関数の定義方法について記載されています。
-
# Windows PowerShell: パラメーターを定義する
- パラメータの定義方法が詳細に記載されています。
まとめ
パイプラインでも使える関数のテンプレートと、定義方法についてまとめました。パイプラインの仕組みをうまく使えば再利用可能なスクリプトが組めるようになります。関数を実装する場合は、パイプラインにも対応してみてください。
追伸:
「Windows Powershell IDE」で「Ctrl+J」を入力すると、基本的なPowershellの構文テンプレートを入力してくれることに、いまさらながら気づきました。
「Ctrl+J」でテンプレートを選べるので、「Cmdlet (高度な関数)」や「Cmdlet (高度な関数) - 完了」を選べばテンプレートを入力してくれます。
最後まで読んでいただきありがとうございます。
また読んでくださいませ。
そんじゃーね。