【PowerShell】引数の受け取り方まとめ(前半)


この記事はプロモーションを含みます。

PowerShell

ホーム > PowerShell 逆引きリファレンス

PowerShellで、引数を受け取る方法を解説します。

はじめに

PowerShellで引数を受け取る方法は、様々な方法があります。

本記事では、取得した引数を1つの変数(配列形式)に格納する方法や、
複数の変数に格納する方法など、様々な方法をご説明したいと思います。

また、内容が多いので、前半(本記事)と後半に分けて解説しています。
後半では、以下の内容について解説しています。

引数を配列形式で取得する

引数を配列形式で取得する方法です。
受け取った引数は、配列 $Args[] に格納されます。
以下は、実行時の書式です。

PowerShellスクリプト名.ps1 引数1 引数2 ...

以下はサンプルのスクリプトで、渡された引数を1つずつ表示します。

# 引数1の内容を表示
Write-Host $Args[0]
# 引数2の内容を表示
Write-Host $Args[1]
# 引数3の内容を表示
Write-Host $Args[2]

サンプルの実行結果です。

PS C:\workspace\PowerShell>> .\test.ps1 りんご メロン みかん
りんご
メロン
みかん

変数名を指定して取得する

Param属性を使用することで、受け取った引数を格納する変数名を指定することが出来ます。
以下は、変数名を指定する場合の書式です。

Param(引数1として渡された値を格納する変数名, 引数2として渡された値を格納する変数名, ...)

以下は、実行時の書式です。

PowerShellスクリプト名.ps1 引数1 引数2 ...

実行時の引数の渡し方ですが、以下のように、どの引数に何の値を渡すか、明示的に記述することも出来ます。

PowerShellスクリプト名.ps1 -arg0 値1 -arg1 値2 ...

また、この方法ですが、入力補完機能を使用することが出来ます。
具体的には、[-](ハイフン)の入力後、Tabキーを押すことで、arg0 → arg1 → arg2 と、使用可能な引数を選択することが出来ます。

以下はサンプルのスクリプトで、渡された引数を1つずつ表示します。

# 引数を変数に格納
Param($arg0, $arg1, $arg2)
# 引数1の内容を表示
Write-Host $arg0
# 引数2の内容を表示
Write-Host $arg1
# 引数3の内容を表示
Write-Host $arg2

Prame属性ですが、上記に加えて、以下のように改行を交えて記述することも可能です。
引数を複数定義する場合は、カンマ区切りで記述する必要があります。

# 引数を変数に格納
Param(
	$arg0,
	$arg1,
	$arg2
)
# 引数1の内容を表示
Write-Host $arg0
# 引数2の内容を表示
Write-Host $arg1
# 引数3の内容を表示
Write-Host $arg2

サンプルの実行結果です。

PS C:\workspace\PowerShell>> .\test.ps1 りんご メロン みかん
りんご
メロン
みかん

引数の初期値を設定する

PowerShellでは、引数に初期値を設定することも出来ます。
以下は、引数の初期値を設定する場合の書式です。

Param(
	[引数1の型]引数1として渡された値を格納する変数名 = "値",
	[引数2の型]引数2として渡された値を格納する変数名 = 値,
	[引数3の型]引数3として渡された値を格納する変数名 = 値
)

引数に渡す値の囲み記号ですが、基本的には下記のように指定します。
・数値:囲み記号を使用しない
・文字列:ダブルクォーテーション

囲み記号について、詳しく知りたい方は以下を参考にして下さい。

以下はサンプルのスクリプトで、渡された引数を1つずつ表示します。
引数1[$arg1]と引数3[$arg2]に初期値として、値[777]を設定しています。

初期値には、数値や文字列の他、環境変数やコマンドレットの実行結果を設定することも可能です。

# 引数を変数に格納
Param(
	[String]$arg0,
	[Int]$arg1 = 777,
	[Long]$arg2 = 777
)
# 引数1の内容を表示
Write-Host $arg0
# 引数2の内容を表示
Write-Host $arg1
# 引数3の内容を表示
Write-Host $arg2

スクリプトを実行する際の書式です。

PowerShellスクリプト名.ps1 引数1 引数2 ...

サンプルの実行結果です。
引数3は何も値を指定していないため、初期値の[777]が表示されています。

PS C:\workspace\PowerShell>> .\test.ps1 りんご 111
りんご
111
777

入力出来る値を指定する

引数に入力出来る値を指定する方法を説明します。
値を指定することで、スクリプトを実行する際、入力支援が働くようになります。

以下が書式になります。

Param(
	[ValidateSet("値1-1","値1-2")][型]引数1,
	[ValidateSet("値2-1","値2-2")][型]引数2
)

サンプルのスクリプトです。
配列の各要素の内容と要素数を表示しています。

# 引数を変数に格納
Param(
	[ValidateSet("りんご","メロン")][String]$arg0,
	[ValidateSet("123","789")][Int]$arg1
)

# 各要素の値を表示
Write-Host $arg0
Write-Host $arg1

スクリプトを実行する際の書式です。

PowerShellスクリプト名.ps1 引数1 引数2 ...

サンプルの実行結果です。

PS C:\workspace\PowerShell>> .\test.ps1 りんご 123
りんご
123

設定されている値以外が入力されると、下記のエラーが発生します。

PS C:\workspace\PowerShell>> .\test.ps1 りんご 777
C:\workspace\PowerShell\test.ps1 : パラメーター 'arg1 の引数を確認できません。引数 "777" は、Validate
Set 属性で指定されたセット "123,789" に属していません。このセットの引数を指定して、コマンドを再度実行してください。
発生場所 行:1 文字:34
+ .\test.ps1 りんご 777
+                                  ~~~
    + CategoryInfo          : InvalidData: (:) [test.ps1]、ParameterBindingValidationException
    + FullyQualifiedErrorId : ParameterArgumentValidationError,test.ps1

引数の入力を必須入力にする

引数の入力を必須入力にする方法を説明します。

以下が書式になります。
(PowerShellのバージョン3以降であれば「=$true」は省略出来ます)

Param(
	[parameter(mandatory=$true)][型]引数1
)

サンプルのスクリプトです。
配列の各要素の内容と要素数を表示しています。

# 配列型の引数を受け取る
Param(
	[parameter(mandatory=$true)][String]$arg0,
	[parameter(mandatory=$true)][Int]$arg1
)

# 各要素の値を表示
Write-Host $arg0
Write-Host $arg1

スクリプトを実行する際の書式です。

PowerShellスクリプト名.ps1 引数1 引数2 ...

サンプルの実行結果です。

PS C:\workspace\PowerShell>> .\test.ps1 りんご 777
りんご
777

引数を入力せずに実行すると、対話形式で入力を促されます。
それでも入力しない場合は、以下のエラーが発生します。
*数値の場合は「0」として扱われます。

PS C:\workspace\PowerShell>> .\test.ps1
コマンド パイプライン位置 1 のコマンドレット test.ps1
次のパラメーターに値を指定してください:
arg0:
arg1:
C:\workspace\PowerShell\test.ps1 : 引数が空の文字列であるため、パラメーター 'arg0' にバインドできませ
ん。
発生場所 行:1 文字:1
+ .\test.ps1
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidData: (:) [test.ps1]、ParameterBindingValidationException
    + FullyQualifiedErrorId : ParameterArgumentValidationErrorEmptyStringNotAllowed,test.ps1

コメント

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