適材適所

WindowsやPowerShellやネットワーク、IBMなどのシステム系の話やポイ活など気になったことも載せているブログです。

【ValidatePattern】引数(パラメータ)を正規表現でチェックする【PowerShell】

PowerShellの引数チェックには様々なものがあります。

パラメータの先頭などに属性を付与することができ、その属性で多様なチェックを行うことができます。

いちいちプログラムの中でチェックしなくても引数に制限を設けることで

関数やスクリプトでスマートなコーディングができるよう、考えられており、とても便利です。

今回はその中でもパラメータを正規表現でチェックする方法を紹介したいと思います。

ValidatePattern属性

 
function Test
{
  param([ValidatePattern('^[A-Z][1-5][0-9]$')][string]$myarg)
  Write-Host "param is $myarg"
}

パラメータ$myargにValidatePattern属性を付与しています。

こうすることでA~Zの文字で始まり、続く文字は1~5、最後は0~9で終わる文字列のみを受け入れるようになります。

正規表現に一致しないパラメタを渡すと、エラーになります。

PS C:\> Test -myarg "1"
Test : パラメーター 'myarg の引数を確認できません。引数 "1" が "^[A-Z][1-5][0-9]$" パターンに一致
しません。"^[A-Z][1-5][0-9]$" に一致する引数を指定して、コマンドを再度実行してください。
発生場所 行:1 文字:13
+ Test -myarg "1"
+~~~
+ CategoryInfo: InvalidData: (:) [Test]、ParameterBindingValidationException
+ FullyQualifiedErrorId : ParameterArgumentValidationError,Test

パラメータ宣言の先頭に[ValidatePattern('正規表現')]を付与することで、

簡単にパラメータの書式をチェックすることができます。

ValidatePattern属性のoptionについて

ValidatePattern属性には、実はoptionを指定することができます。

System.Text.RegularExpressions.RegexOptions列挙値を渡すことで

正規表現の挙動を変更することができます。

具体的には次のように指定します。

 
function Test
{
param([ValidatePattern('^[A-Z][1-5][0-9]$',Options=[System.Text.RegularExpressions.RegexOptions]::IgnoreCase)][string]$myarg)
Write-Host "param is $myarg"
}

こうすると、大文字・小文字の区別をなくします。

PS C:\> Test -myarg "a19"
param is a19
PS C:\> Test -myarg "A19"
param is A19

System.Text.RegularExpressions.RegexOptions列挙値には他にもありますが、

IgnoreCaseくらい覚えておけばいいかなぁと個人的には思います。

詳しく知りたい方はこちらの公式ドキュメントをお読みいただけるといいかと思います。

終わりに

PowerShellの引数(パラメータ)を正規表現でチェックする方法の紹介でした。

エレガントなコードを書くために覚えておくと便利なの属性ですが、

正規表現がちょっとだけ敷居が高い・・・かも?

ネット上には博識な諸先輩方が正規表現のチートシートをあげてくれているのでググってみるといいかと思います(丸投げ)

というわけで、ここまでお読みいただきありがとうございました。