実行時引数を受け取る
実行時引数は $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