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

コメント

タイトルとURLをコピーしました