powershell

PowerShellパラメータチェック

ずいぶんとラクチンです。以下のように書くだけで誤ったパラメータを与えると赤文字でエラーメッセージを適宜出力してくれます。

パラメータチェック

Param(
    [ValidateSet("DB01","DB02","DB03")] $Arg1
)
サンプルスクリプト
function Test-001 {
    Param(
        [ValidateSet('DB01', 'DB02', 'DB03')][string] $arg1,
        [string] $arg2,
        [int] $arg3,
        [switch] $arg4
    )
    Write-Host "arg1 : $arg1"
    Write-Host "arg2 : $arg2"
    Write-Host "arg3 : $arg3"
    Write-Host "arg4 : $arg4"
    $val1 = $arg3 + 1
    $val2 = $arg3 * 1
    Write-Host "arg3 + 1="$val1  "   arg3 * 1="$val2
    if ($arg2 -eq $null) {
        Write-Host "arg2 nullです"
    }
    if ($arg2 -eq '') {
        Write-Host "arg2 空文字です"
    }
    if ($arg3 -eq $null) {
        Write-Host "arg3 nullです"
    }
    if ($arg3 -eq '') {
        Write-Host "arg3 空文字です"
    }
    return
}
実行例1

arg1へあらかじめ決められた値以外を設定すると以下のようなエラー処理をしてくれます。

PS C:\temp\work> Test-001 -arg1 db0
Test-001 : パラメーター 'arg1 の引数を確認できません。引数 "db0" は、ValidateSet 属性で指定されたセット "DB01,DB02,DB03
" に属していません。このセットの引数を指定して、コマンドを再度実行してください。
発生場所 行:1 文字:16
+ Test-001 -arg1 db0
+                ~~~
    + CategoryInfo          : InvalidData: (:) [Test-001]、ParameterBindingValidationException
    + FullyQualifiedErrorId : ParameterArgumentValidationError,Test-001

PS C:\temp\work>
実行例2

arg1のパラメータチェックを確認したので他の動き確認します。

-- string型(arg2)、int型(arg3)のパラメータ未設定の場合は空文字が設定される事わかります。
-- int型については空文字は0として振る舞います
-- switch を指定した場合は(これはデータ型ではありません)未設定の場合Falseとなります。
--
PS C:\temp\work> Test-001 -arg1 db01
arg1 : db01
arg2 :
arg3 : 0
arg4 : False
arg3 + 1= 1    arg3 * 1= 0
arg2 空文字です
arg3 空文字です
PS C:\temp\work>

-- string型(arg2)、int型(arg3)にそれぞれ空文字''を渡してみても先ほどの省略した時
-- と同じ動作です。arg4についてはvalue値を指定せずとも-arg4との記載だけでtrueになります。
--
PS C:\temp\work> Test-001 -arg1 db01 -arg2 '' -arg3 '' -arg4
arg1 : db01
arg2 :
arg3 : 0
arg4 : True
arg3 + 1= 1    arg3 * 1= 0
arg2 空文字です
arg3 空文字です
PS C:\temp\work>

自身で作ったチェックの結果を同様にエラー出力する場合

Write-Error -Messageを使います。

if( -not (Test-Path $Arg1 ) ) {
    Write-Error -Message "指定のファイルが存在しません。" -ErrorAction Stop
}
サンプルスクリプト
function Test-002 {
    Param(
        [ValidateSet('DB01', 'DB02', 'DB03')][string] $arg1 = 'DB02',
        [string] $arg2
    )
    Write-Host $arg1
    Write-Host $arg2

    if ( -not (Test-Path $Arg2 ) ) {
        Write-Error -Message "指定のファイルが存在しません。" -ErrorAction Stop
    }
    Write-Host "------------"
    $files = Get-Item $Arg2\*.txt
    foreach ($f in $files) {
        Write-Host $f
    }
    return
}
実行例1
-- -ErrorAction Stop と記載しているので後の処理は実行されません。
--
PS C:\temp\work> Test-002 -arg2 .\work
DB02  <-- デフォルト設定「 $arg1 = 'DB02'」をしているので省略しても設定できています。
.\work
Test-002 : 指定のファイルが存在しません。
発生場所 行:1 文字:1
+ Test-002 -arg2 .\work
+ ~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [Write-Error], WriteErrorException
    + FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException,Test-002

PS C:\temp\work>
-- 正常に動作できた場合
--
PS C:\temp\work> Test-002 -arg2 .\temp
DB02
.\temp
------------
C:\temp\work\temp\sample1.txt
C:\temp\work\temp\sample2.txt
PS C:\temp\work>

arg1へあらかじめ決められた値以外を設定すると以下のようなエラー処理をしてくれます。

スポンサーリンク

コメント