【PowerShell】Paramによる引数の受け取り方法
PowerShellのParamによる引数の受け取り方法について記載します。
<環境>
OS:Windows10(64bit)
PSVersion:v5.1
Paramの基本構文
構文
Paramの引数はカンマ区切りで複数定義できます。引数ごとに改行することもできます。
Paramはコメントを除き、スクリプトの冒頭に記載する必要があります。
Paramはコメントを除き、スクリプトの冒頭に記載する必要があります。
スクリプト例
Param($arg1, $arg2)
Write-Output "arg1 = $arg1"
Write-Output "arg2 = $arg2"
実行例
引数名を指定しない場合は、引数の定義順に値を渡します。
PS C:\work> .\test.ps1 "foo" "bar"
arg1 = foo
arg2 = bar
明示的に引数名を指定することで、指定した引数に値を渡します。
PS C:\work> .\test.ps1 -arg2 "foo" -arg1 "bar"
arg1 = bar
arg2 = foo
引数の型を指定
・構文
Paramは[型]引数とすることで、引数に型を指定します。
・スクリプト例
Param(
[string]$arg1,
[int]$arg2,
[bool]$arg3,
[DateTime]$arg4,
[string[]]$arg5
)
Write-Output "arg1 = $arg1"
Write-Output "arg2 = $arg2"
Write-Output "arg3 = $arg3"
Write-Output "arg4 = $arg4"
Write-Output "arg5 = $($arg5 -join ', ')"
実行例
配列はカンマ区切りで値を渡します。
PS C:\work> .\test.ps1 "foo" 99 $true "2023-05-25" "AAA", "BBB", "CCC"
arg1 = foo
arg2 = 99
arg3 = True
arg4 = 05/25/2023 00:00:00
arg5 = AAA, BBB, CCC
引数に初期値を設定
構文
Paramの各引数にイコールで初期値を設定します。
スクリプト例
Param(
[string]$arg1 = "initial",
[int]$arg2 = "0",
[bool]$arg3 = $true,
[DateTime]$arg4 = (Get-Date),
[string[]]$arg5 = ("AAA","BBB","CCC")
)
Write-Output "arg1 = $arg1"
Write-Output "arg2 = $arg2"
Write-Output "arg3 = $arg3"
Write-Output "arg4 = $arg4"
Write-Output "arg5 = $($arg5 -join ', ')"
実行例
未指定の引数は、初期値が入力されます。
PS C:\work> .\test.ps1 -arg2 99 -arg3 $false
arg1 = default
arg2 = 99
arg3 = False
arg4 = 05/25/2023 23:53:34
arg5 = AAA, BBB, CCC
引数に必須パラメータを設定
構文
Paramの引数に[parameter(mandatory)]を付与すると、必須パラメータとなります。
必須パラメータが未入力のときはエラーとなります。
必須パラメータが未入力のときはエラーとなります。
スクリプト例
Param(
[parameter(mandatory)][string]$arg1,
[parameter(mandatory)][string]$arg2
)
Write-Output "arg1 = $arg1"
Write-Output "arg2 = $arg2"
実行例
必須パラメータが未入力の場合は、入力を求められます。
PS C:\work> .\test.ps1 "foo"
コマンド パイプライン位置 1 のコマンドレット test.ps1
次のパラメーターに値を指定してください:
arg2:
必須パラメータの引数が空文字の場合は、エラーが発生します。
PS C:\work> .\test.ps1 "foo" ""
C:\work\test.ps1 : 引数が空の文字列であるため、パラメーター 'arg2' にバインドできません。
発生場所 行:1 文字:18
+ .\test.ps1 "foo" ""
+ ~~
+ CategoryInfo : InvalidData: (:) [test.ps1]、ParameterBindingValidationException
+ FullyQualifiedErrorId : ParameterArgumentValidationErrorEmptyStringNotAllowed,test.ps1
引数のチェック
構文
Paramの引数にValidate属性を付与すると、入力値をチェックできます。
Validate属性の制約に違反した場合は、エラーメッセージを表示します。
Validate属性の制約に違反した場合は、エラーメッセージを表示します。
以下にValidate属性のチェック内容と実行例を記載します。
Validate属性 | チェック内容 |
---|---|
[ValidateNotNull()] | 引数の値が$nullでないことをチェックする。 |
[ValidateNotNullOrEmpty()] | 引数の値が$null または 空文字でないことをチェックする。 |
[ValidateSet("Option1", "Option2")] | 引数が指定した値のいずれかと一致していることをチェックする。 左記は"Option1"または"Option2"と一致するかチェックします。 |
[ValidateCount(1, 5)] | 引数の配列やコレクションの要素数が指定した範囲内にあることをチェックする。 左記は要素数が"1文字以上、5文字以下かチェックします。 |
[ValidateLength(1, 5)] | string型引数の文字数が指定した値の範囲内であることをチェックする。 左記は文字数が1以上、5以下かチェックします。 |
[ValidateRange(1, 10)] | 引数が指定した値の範囲内であることをチェックする。 左記は値が1以上、10以下かチェックします。 |
[ValidatePattern("^[a-zA-Z0-9]+$")] | 引数が指定した正規表現と一致することをチェックする。 左記は値が半角英数字かチェックします。 |
[ValidateScript({if ($_ % 2 -eq 0) {$true} else {$false}})] | 引数の値が指定したスクリプトで$trueを返すかチェックする。 左記は値が偶数(2で割り切れる)かチェックします。 |
スクリプト例
Param(
[ValidateNotNullOrEmpty()][string]$arg1,
[ValidateSet("Option1", "Option2")][string]$arg2,
[ValidateLength(1, 5)][string]$arg3
)
Write-Output "arg1 = $arg1"
Write-Output "arg2 = $arg2"
Write-Output "arg3 = $arg3"
実行例
Validate属性に違反する値を引数で設定します。
空文字は、[ValidateNotNullOrEmpty()]に違反しています。
PS C:\work> .\test.ps1 "" "Option1" "bar"
C:\work\test.ps1 : パラメーター 'arg1 の引数を確認できません。引数が null または空です。null または空でない引数を指定して、コマンドを再度実行してください。
発生場所 行:1 文字:12
+ .\test.ps1 "" "Option1" "bar"
+ ~~
+ CategoryInfo : InvalidData: (:) [test.ps1]、ParameterBindingValidationException
+ FullyQualifiedErrorId : ParameterArgumentValidationError,test.ps1
"XXX"は[ValidateSet("Option1", "Option2")]に違反しています。
PS C:\work> .\test.ps1 "foo" "XXX" "bar"
C:\work\test.ps1 : パラメーター 'arg2 の引数を確認できません。引数 "XXX" は、ValidateSet 属性で指定されたセット "Option1,Option2" に属していません。このセットの引数を指定して、コマンドを再度実行してください。
発生場所 行:1 文字:18
+ .\test.ps1 "foo" "XXX" "bar"
+ ~~~~~
+ CategoryInfo : InvalidData: (:) [test.ps1]、ParameterBindingValidationException
+ FullyQualifiedErrorId : ParameterArgumentValidationError,test.ps1
"foobar"は[ValidateLength(1, 5)]に違反しています。
PS C:\work> .\test.ps1 "foo" "Option1" "foobar"
C:\work\test.ps1 : パラメーター 'arg3 の引数を確認できません。引数の文字の長さ 6 が長すぎます。引数の文字の長さが "5" 文字以下になるように短くして、コマンドを再実行してください。
発生場所 行:1 文字:28
+ .\test.ps1 "foo" "Option1" "foobar"
+ ~~~~~~~~
+ CategoryInfo : InvalidData: (:) [test.ps1]、ParameterBindingValidationException
+ FullyQualifiedErrorId : ParameterArgumentValidationError,test.ps1
他のValidate属性の実行例は割愛します。
参考サイト
Validate属性のMicrosoftリファレンス(パラメーター入力を検証する方法)
https://learn.microsoft.com/ja-jp/powershell/scripting/developer/cmdlet/how-to-validate-parameter-input?view=powershell-5.1/
https://learn.microsoft.com/ja-jp/powershell/scripting/developer/cmdlet/how-to-validate-parameter-input?view=powershell-5.1/