HOWTO · PowerShell
PowerShell のパラメーターに複数の値
この記事では、パラメータ関数、パラメータで定義できるさまざまな種類の変数、単一のパラメータで複数の値を扱う方法、およびそのサンプル使用について説明します。
私たちは PowerShell のパラメータ関数 param を使用して引数を処理します。これはスクリプトの基本的な要素であり、開発者が実行時に入力を提供できるようにします。
さらに、スクリプトの動作を変更する必要がある場合、パラメータは基となるコードを変更せずに変更する機会を提供することができます。
この記事では、parameter 関数や、定義できるさまざまな変数、単一のパラメータで複数の値を処理する方法、サンプルの使用法について説明します。
PowerShell における Parameter 関数の理解
管理者は、パラメータ関数 param() を使用してスクリプトのパラメータを作成できます。
内部では、パラメータ関数は変数で定義された 1つまたはそれ以上のパラメータを含みます。
param ($myVariable)
ただし、パラメータが必要なタイプの入力のみを受け付けることを確認するために、変数の前にデータ型を角括弧 [] で囲んで指定するのが最善です。
param ([String]$myVariable)
–>
他のデータ型、例えば 整数、浮動小数点、日付時刻 なども使用できることに注意する価値があります。また、Boolean データ型としても割り当てることができ、これについてはさらに詳しく説明します。
PowerShell における Named パラメータの使用
スクリプト内でパラメータ関数を使用するのは named パラメータを介してです。
named パラメータを介してスクリプトや関数に値を渡すときは、変数の名前をパラメータのフルネームとして使用できます。
sample.ps1:
param ([String]$name)
Write-Output $name
その後、.ps1 ファイルを実行する際に名前付きパラメータを使用できます。
powershell.exe .\sample.ps1 -name "John"
PowerShell におけるパラメータのデフォルト値の使用
スクリプト内でパラメータに値を与えることで、デフォルト値を事前に割り当てることができます。
さらに、コマンドラインから値を渡すことなくスクリプトを実行すると、スクリプト内で定義されたデフォルト変数が使用されます。
param ([String]$name = "John")
PowerShell における Switch パラメータの使用
スクリプト用に別のパラメータ型を使用することができます:[switch] データ型で定義された switch パラメータです。
このパラメータは、以前に説明したバイナリまたはブール値で主に使用され、true または false の値を示します。
param ([switch]$isEnabled)
–>
PowerShell における Mandatory パラメータの使用
スクリプトが実行されるときに、1つ以上のパラメータを使用する必要がある場合がよくあります。
[Parameter()] のパラメータブロック内に Mandatory 属性を追加することで、必須パラメータを定義できます。
param (
[Parameter(Mandatory)]
[String] $servername
)
スクリプト環境は、コマンドラインで値が提供されない限りスクリプトを実行できません。
PowerShell における不明な数の引数の使用
一般的に、名前付きパラメータを使用するのがコマンドラインから引数を単に読むよりも優れていると感じます。不明な数の引数を処理する必要がある場合、引数を読み取るのが容易です。
ドライブレターを例にとりましょう。おそらく、機械内の 1つまたはそれ以上のドライブをチェックするスクリプトが必要です。
その場合、名前付きパラメータを使用し、それを String データ型として宣言できます。
checkdrives.ps1:
param([String]$myDrive)
foreach ($drive in $myDrive) {
Write-Output "Processing drive $drive"
}
ただし、引数に複数のドライブレターを渡すと、PowerShell はこれを 1つのオブジェクトとして扱います。
powershell .\checkdrives.ps1 -myDrive C, D, E
出力:
Processing drive C D E
PowerShell はカンマを空白に置き換え、1つの変数として扱います。残念ながら、これは、私たちのユースケースでは各ドライブを個別に処理する必要があるため、うまくいきません。
1つの引数の下で複数のパラメータをキャプチャするために、データ型を配列として角括弧 [] で変更する必要があります。その後、実行されると、PowerShell はリストされた引数を個別に処理します。
checkdrives.ps1:
param([String[]]$myDrive)
foreach ($drive in $myDrive) {
Write-Output "Processing drive $drive"
}
例のコード:
powershell .\checkdrives.ps1 -myDrive C, D, E
引数をカンマで区切ることを忘れないでください。
出力:
Processing drive C
Processing drive D
Processing drive E
PowerShell におけるパイプラインパラメータの使用
ほとんどの PowerShell cmdlet は、データの受け渡しにパイプ | シンボルを使用できます。これは、パラメータに関しても活用できます。
たとえば、パイプラインに保存された最後の値を取得し、パラメータブロックの ValueFromPipeline 属性を使用して別の PowerShell ファイルに渡すことができます。
pipeline.ps1:
param([parameter(ValueFromPipeline)]$pipedVar)
Write-Output $pipedVar
例のコード:
"This string is from the pipeline." | .\pipeline.ps1
出力:
This string is from the pipeline.
この技術を使用することで、チェーンされた PowerShell ファイルを実行するための多くの機会が開かれます。