PowerShellの関数の引数の受け取り方

こんにちは。
けいぞうです。

今回は「PowerShellの関数の引数の受け取り方」についての記事になります。

[目次]

  • PowerShellの関数の引数の受け取り方まとめ
  • パラメータリストを用いた方法
  • $Args変数を用いた方法
  • paramブロックを用いた方法

PowerShellの関数の引数の受け取り方まとめ

PowerShell関数で引数(パラメータ)を指定する方法は3つあります。

■1つ目はパラメータリストを記述する方法

function 関数名 (パラメータリスト)
{
    # 処理
}

■ 2つ目は$Args関数を用いる方法

function 関数名
{
    $Args[0] #先頭の引数
    $Args[1] #次の引数
  ・・・
}

■ 3つ目の方法は、paramブロックを用いる方法

function 関数名
{
    param(パラメーター)
}

パラメータリストを用いた方法

この方法が最も一般的で、ほかの言語とも近い書き方です。

例えばint型のパラメータを1つ受け取れる関数は以下のように記述します。

function func([int]$num)
{
    # 処理
}

また、型は省略して書くことができます。省略した場合は、呼び出し側で渡された型がそのまま使われます。

function func($num)
{
    # 処理
}

他の言語と同様に、デフォルトの値を指定することもできます。

function func([int]$num = 524)
{
    # 処理
}

呼び出し側で引数が指定されなかった場合は、関数の中でこのデフォルト値が使われます。

$Args変数を用いた方法

呼び出し側で渡されたパラメータは、$Argsという配列に自動的に追加されます。以下のように使うことが可能です。

>function func
>>{
>>    $Args[0]
>>    $Args[1]
>>}

> func 1 "test"
1
"testtest"

また、一般的なパラメータリストと$Args変数を併用することも可能です。

例えば、パラメータリストに1つのint型変数を指定していた場合に、呼び出し側で引数を2つ以上渡したら、2つ目以降の引数は$Argsに追加されます。

function func([int]$num)
{
    $num
    $Args[0]
    $Args[1]
}
>func 1 2 "test"
1
2
test

paramブロックを用いた方法

あんまり見ない書き方ですが、paramブロックの中にパラメータを指定するという記述方法もあります。

function func
{
    param(
        [int]$num,
        [string]$str
    )

    $num
    $str
}

paramブロックと普通のパラメータリストを併用したらどうなるでしょうか?

function func([int]$num1)
{
    param(
        [int]$num2
    )

    $num1
    $num2
}
発生場所 行:3 文字:5
+     param(
+     ~~~~~~
function の宣言に引数が指定されている場合、param ステートメントを使用できません。
    + CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : OnlyOneParameterListAllowed

エラーになりました。

paramブロックと通常のパラメータリストは併用できないようです。