実行時引数を受け取る

実行時引数は $args という配列変数で取り出すことができます。

シンプルに引数を取り出す

Write-Host( "args[0] is " + $args[0] )
Write-Host( "args[1] is " + $args[1] )
Write-Host( "args[2] is " + $args[2] )

下記が実行結果です。

PS C:\tmp\rec> ./test.ps1 AAA BBB CCC
args[0] is AAA
args[1] is BBB
args[2] is CCC

同様のスクリプトで2個しか引数を指定しなかった場合です。引数が不足しても特にエラーは出ません。

PS C:\tmp\rec> ./test.ps1 hello world
args[0] is hello
args[1] is world
args[2] is

同様のスクリプトで3個よりも多い引数を指定した場合です。引数が過剰でも特にエラーは出ません。

PS C:\tmp\rec> ./test.ps1 aaa bbb ccc ddd
args[0] is aaa
args[1] is bbb
args[2] is ccc

配列 $args からループで引数を取り出す

$args は配列なので引数がたくさんあってもループで取り出せば問題ありません。

ForEach( $item in $args )
{
    Write-Host( $item )
}
PS C:\tmp\rec> ./test.ps1 a b c d e f g h i j
a
b
c
d
e
f
g
h
i
j

引数に型指定をする

まずは引数として文字列を指定する場合を示します。

Param(
    [string] $my_arg0,
    [string] $my_arg1
)

# 文字列の連結.
$sum = $my_arg0 + $my_arg1

Write-Host( $my_arg0 )
Write-Host( $my_arg1 )
Write-Host( $sum )
PS C:\tmp\rec> ./test_a.ps1 111 222
111
222
111222

つぎに引数として整数を指定する場合を示します。

Param(
    [int] $my_arg0,
    [int] $my_arg1
)

# 整数の加算.
$sum = $my_arg0 + $my_arg1

Write-Host( $my_arg0 )
Write-Host( $my_arg1 )
Write-Host( $sum )
PS C:\tmp\rec> ./test_b.ps1 111 222
111
222
333

ここで引数として整数を要求しているのに、整数に変換できないような文字列を与えると下記のようにエラーメッセージが出現します。

PS C:\tmp\rec> ./test_b.ps1 hello world
C:\tmp\rec\test.ps1 : パラメーター 'my_arg0' の引数変換を処理できません。
値 "hello" を型 "System.Int32" に変換できません。エラー: "入力文字列の形式が正しくありません。"
発生場所 行:1 文字:12
+ ./test.ps1 hello world
+            ~~~~~
    + CategoryInfo          : InvalidData: (:) [test.ps1]、ParameterBindingArgumentTransformationException
    + FullyQualifiedErrorId : ParameterArgumentTransformationError,test.ps1

ただ、気が利いていることに16進を示す文字列ならば整数として解釈されます。具体的には 0x というプレフィクスをつけます。16進の 0xff は10進数で 255 です。同様に 0x01 は 1 です。なので加算結果は 256 になります。

PS C:\tmp\rec> ./test_b.ps1 0xff 0x01
255
1
256

実行時引数にデフォルト値を指定する

引数を指定しない場合の初期値を定義することができます。下記のようにします。

Param(
    [int] $my_arg0 = 111,
    [int] $my_arg1 = 222
)

$sum = $my_arg0 + $my_arg1

Write-Host( $my_arg0 )
Write-Host( $my_arg1 )
Write-Host( $sum )

引数を指定しなかった場合は下記のような実行結果になります。

PS C:\tmp\rec> ./test_c.ps1
111
222
333

引数を指定した場合は下記のような実行結果になります。初期値が実行時引数に上書きされていることがわかります。

PS C:\tmp\rec> ./test_c.ps1 333 444
333
444
777