PowerShell: 関数の引数を参照渡し[ref]にする

PowerShellで関数の引数を参照渡しにする方法と、 その際の注意点を紹介します。
参照渡しにしたい引数の前に[ref]を付ける、 「.Value」を使う、 呼び出し時に()丸括弧で囲む等、 知らないとはまってしまうポイントがいくつかあるので解説します。

まずは関数側の記述方法です。

function 関数名([ref]$引数名) {
	
	$p.Value         # 取得
	$p.Value = 値    # 設定
	
}

参照渡しにする引数の前に[ref]を付けます。 refは英単語「reference(参照)」の略です。
例えば引数名が「left」だとしたら「[ref]$left」と記述します。

参照渡しの変数の値を取得したり設定する場合 「変数.Value」と記述します。 「.Value」がないとエラーになります。 複数の箇所で変数を使っていると 「.Value」を忘れやすいため注意が必要です。

次は関数の呼び出し時の書き方です。

関数名 ([ref]$変数名)

参照渡しにする変数の前に[ref]を付け、 さらに()丸括弧で括ります。 この()丸括弧も忘れやすい所です。

引数が複数あり、一つが参照渡しでもう一つが値渡しの場合は 次のようにスペースで区切って記述します。

関数名 ([ref]$変数名1) $変数名2

次のコードは引数の参照渡しの具体例です。
変数$numを参照渡しにして、 関数側で変数$pの値を書き換えています。 出力結果から変数$numの値が書き換わっているのがわかります。

function test_ref([ref]$p, $sec) {

	$p.Value = $p.value * $sec

}

$num = 5
Write-Host $num

test_ref ([ref]$num) 10

Write-Host $num

# 実行結果
5
50

まとめ

以上、PowerShellで関数の引数を参照渡しにする方法を解説しました。 ポイントとなるのは以下の3つです。

  • 関数側で仮引数の前に[ref]を付ける。
  • 関数側で引数の値を取得・設定する場合は「変数.Value」とする
  • 呼び出し側で実引数の前に[ref]を付け、さらに()丸括弧で囲む

(まとめ記事: PowerShell 関数

PowerShell
PR