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)]

PoweShell 3.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

コメント

  1. […] Powershell で引数を受け取る | マイクロソフ党ブログ […]

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