こんにちは、西日本クラウドGの山崎です!
今回はPower Shellスクリプトにおいて利用される“値渡し”と“参照渡し”の利用方法の違いについて解説していきたいと思います。
そもそも値渡しと参照渡しとは、プログラミングにおいて関数やメソッドに対する引数の渡し方の違いとなります。
- 値渡し(Pass by Value)
値はコピーされる。
関数内で引数を変更しても元の変数は変更されない。 - 参照渡し(Pass by Reference)
値は直接渡される(メモリのアドレスが渡される)
関数内で引数を変更すると元の変数も変更される。
Power Shellにおいては参照渡しか値渡しかでコードの書き方も異なってしまいます。
本記事ではその際の記述方法や、注意点を解説していきます。
値渡し
Power Shellにおいてはデフォルトの動作となり、記述もシンプルです。
=====
function Modify-Value($x) {
$x = $x + 1
}
$a = 5
Write-Output “関数実行前:”$a # 出力: 5
Modify-Value -x $a
Write-Output “関数実行後:”$a # 出力: 5
=====
$aに5を代入した後、Modify-Value関数にて$aを引数とすると、6が返ってきます。
しかし、$aの値自体はコピーされて関数に渡されているため$aは5となり、更新されません。

参照渡し
Power Shellにおいて参照渡しを行う際は明示的に記載する必要があります。
=====
function Modify-Reference([ref] $x) {
$x.Value = $x.Value + 1
}
$a = 5
Write-Output “関数実行前:”$a # 出力: 5
Modify-Reference -x ([ref]$a)
Write-Output “関数実行後:”$a # 出力: 6
=====
参照渡しにおいては、引数に[ref]という指定を行います。そして関数内で要素を指定する際には$x.Valueといった表記を行います。
Modify-Referenceの引数は参照渡しであることから、Modify-Referenceの実行前後で$aの値が変化しています。

続いて躓きやすい配列を参照渡しの場合の確認を行います。
○参照渡し(配列の場合)
=====
function Modify-Array-Reference([ref]$arr) {
$arr.Value[0] = “aaa”
$arr.Value[1] = $arr.Value[2]
}
$myArray = @(“abc”, “def”, “ghi”, “jkl”)
Write-Output “関数実行前:”$myArray # 出力: abc, def, ghi, jkl
Modify-Array-Reference -arr ([ref]$myArray)
Write-Output “関数実行後:”$myArray # 出力: aaa, ghi, ghi, jkl
=====
配列の場合も同様に引数には[ref]を付け、関数内で要素を指定する際には.Valueを記載します。
$arr.Value[1] = $arr.Value[2]
この行に関して、左辺は.Valueを付けないとエラーが起こりますが、右辺は.Valueを付けなくともエラーが起こらず動いてしまいます。
今回のコードでは分かりやすいですが、引数の種類が多い場合や関数内で定義した変数がある場合は、どれが参照渡しで、どれが値渡しのものかを整理してプログラミングを行う必要があります。

以上がPower Shellにおける値渡しと参照渡しのコード記述方法の違いとなります。
全体でみると難解に感じますが、1つ1つの挙動はシンプルなものなので、詰まったら息抜きしつつ、整理してプログラミングを行っていきましょう!