Powershellで引数を受け取る

Powershell

Powershellスクリプトで引数を受け取る方法です。

非常に多くの機能が実装されていますが、今回は比較的使いそうな部分だけ紹介したいと思います。

バッチやVBSと同様の手法

Powershellスクリプトでは引数は自動的に$Args[]に格納されます。
第一引数は$Args[0]、第二引数は$Args[1]といった形で引き渡されます。

# C:\Sample.ps1
Write-Host $Args[0]
Write-Host $Args[1]
  実行結果

PS C:> .\Sample1.ps1 Test1 Test2
Test1
Test2

引数をあらかじめ宣言する手法

最小限の宣言

Powershellスクリプト内にあらかじめ引数を宣言しておくことで、スクリプト実行時に引数の指定が出来ます。また、シェルで補完機能が利用できるようになります。

冒頭にParam属性を構成します。

# C:\Sample2.ps1
Param($Arg1,$Arg2) #第一引数を$Arg1,第二引数を$Arg2に格納する
Write-Host $Arg1
Write-Host $Arg2
  実行結果
PS C:\>.\Sample2.ps1 Test1 Test2
Test1
Test2

また、明示的にどの引数に値を渡すか指定も可能です。

  実行結果
PS C:\>.\Sample2.ps1 -Arg1 Test1 -Arg2 Test2
Test1
Test2
PS C:\>.\Sample2.ps1 -Arg2 Test2 -Arg1 Test1
Test1
Test2

実行時に「.\Sample2.ps1 -」まで打ってTabボタンを押すと、自動でArg1と補完されます。2回押すとArg2が補完されます。

また、Param()内は改行しても問題ありません。ただし、複数定義する場合はカンマを入れる必要があるので注意してください。

Param(
    $Arg1, #カンマが必要
    $Arg2
)

引数の型を宣言する

あらかじめ受け取る引数の型を宣言することができます。
引数の前に[型]を付与します。

# C:\Sample3.ps1
Param(
    [String]$Arg1, #$Arg1は文字列型,
    [Int]$Arg2     #$Arg2は整数型で宣言
)
Write-Host $Arg1
Write-Host $Arg2
  実行結果
PS C:\>.\Sample3.ps1 -Arg1 Test -Arg2 123
Test1
123

宣言した型以外の引数を渡すとエラーが返ります。

  実行結果
PS C:\>.\Sample3.ps1 -Arg1 Test1 -Arg2 Test2
C:\Sample3.ps1 : パラメーター 'Arg2' の引数変換を処理できません。値 "Test2" を型 "System.Int32" に変換できません。エラー: "入力文字列の形式が正しくありません。"
発生場所 行:1 文字:33
+ .\Sample3.ps1 -Arg1 Test1 -Arg2 Test2
+ ~~~~~
+ CategoryInfo : InvalidData: (:) [Sample3.ps1]、ParameterBindingArgumentTransformationException
+ FullyQualifiedErrorId : ParameterArgumentTransformationError,Sample3.ps1

引数に初期値をセットする

引数に初期値をセットできます。

# C:\Sample4.ps1
Param(
    [String]$Arg1 = "Test1",
    [Int]$Arg2 = 123
)
Write-Host $Arg1
Write-Host $Arg2
  実行結果
PS C:\> .\Sample4.ps1
Test1
123
PS C:\> .\Sample4.ps1 -Arg1 Test2 -Arg2 321
Test2
321

引数を指定しなければ初期値が利用されます。
また初期値に環境変数やコマンドレットの結果をセットすることも可能です。

# C:\Sample5.ps1
Param(
    [String]$Hostname = $Env:COMPUTERNAME, #ホスト名を初期値に設定
    [Datetime]$Date = (Get-Date) #現在日時を初期値に設定
)
Write-Host $Hostname
Write-Host $Date
  実行結果
PS C:\> .\Sample5.ps1
TestServer1
2017/11/16 22:46:16

その他Tips

引数を必須パラメーターとする

以下のParameter属性を設定し、引数を必須とすることができます。

[parameter(mandatory=$true)]

Poweshell3.0移行であれば$trueを省略することも可能です。

# C:\Sample6.ps1
Param(
    [parameter(mandatory=$true)][String]$Arg1,
    [parameter(mandatory=$true)][int]$Arg2
)
Write-Host $Arg1
Write-Host $Arg2
  実行結果
PS C:\> .\Sample6.ps1 #引数無しで実行
コマンド パイプライン位置 1 のコマンドレット Sample6.ps1
次のパラメーターに値を指定してください:
Arg1:
Arg2:
C:\Sample6.ps1 : 引数が空の文字列であるため、パラメーター 'Arg1' にバインドできません。
発生場所 行:1 文字:1
+ .\Sample6.ps1
+ ~~~~~~~~~~~~~
+ CategoryInfo : InvalidData: (:) [Sample6.ps1]、ParameterBindingValidationException
+ FullyQualifiedErrorId : ParameterArgumentValidationErrorEmptyStringNotAllowed,Sample6.ps1

決められた値以外受け付けない

以下のValidate属性を設定し、指定したパラメータ以外受け付けないようにすることができます。

[ValidateSet("aaa","bbb")]

# C:\Sample7.ps1
Param(
    [ValidateSet("Test1","Test2")][String]$Arg1,
    [ValidateSet("123","321")][int]$Arg2
)
Write-Host $Arg1
Write-Host $Arg2
  実行結果
PS C:\> .\Sample7.ps1 -Arg1 Test2 -Arg2 123 #Validate属性にある引数を渡す
Test2
123
PS C:\> .\Sample7.ps1 -Arg1 Test2 -Arg2 1234 #Validate属性にない引数を渡す
C:\Sample7.ps1 : パラメーター 'Arg2 の引数を確認できません。引数 "1234" は、ValidateSet 属性で指定されたセット "123,321"
に属していません。このセットの引数を指定して、コマンドを再度実行してください。
発生場所 行:1 文字:33
+ .\Sample7.ps1 -Arg1 Test2 -Arg2 1234
+ ~~~~
+ CategoryInfo : InvalidData: (:) [Sample7.ps1]、ParameterBindingValidationException
+ FullyQualifiedErrorId : ParameterArgumentValidationError,Sample7.ps1

他にもたくさんの機能があります。気になる方は以下のURLを確認してみてください。

About Functions Advanced Parameters

コメント