PowerShell 関数パラメーター

Migel Hewage Nimesha 2023年1月30日
  1. PowerShell 関数パラメーターを定義する
  2. PowerShell 関数の名前付きパラメーター
  3. PowerShell 関数の位置パラメーター
  4. PowerShell 関数でパラメーターを切り替える
  5. PowerShell 関数パラメーターでのスプラッティング
  6. PowerShell パラメーター属性
  7. 名前付きパラメータ構文を使用した高度な関数
PowerShell 関数パラメーター

PowerShell 関数パラメーターは、特性と引数を利用してユーザーが特定の値を入力できないようにすることで、関数をより強力にします。広範なスクリプトを作成する必要がないように、いくつかのルールと検証が追加されており、簡単に使用できます。

関数パラメーターを指定すると、コマンドラインから引数を指定することもできます。名前付き、位置、スイッチ、および動的パラメーターはすべて、関数パラメーターの例です。関数パラメーターを使用して、基本的な関数をより複雑な関数に変換することもできます。

PowerShell 関数パラメーターを定義する

パラメータは次のように定義されます。

param(
  $Parameter1
)

ベストプラクティスでは、パラメーターに型を追加し、Parameter() ブロックを挿入して、パラメーターが必要な種類の入力を受け取り、将来さらに多くの機能を有効にすることを保証することをお勧めします。したがって、以下のように実行されます。

param(
     [Parameter()]
     [string]$Parameter1
 )

以下に示すように、上記の構文に追加のパラメーターを追加することもできます。

param(
     [Parameter()]
     [string]$Param1,
 
     [Parameter()]
     [string]$Param2
 )
 
Write-Host "Param1 value is $Param1"
Write-Host "Param 2 value is $Param2"

PowerShell 関数の名前付きパラメーター

名前付きパラメーターは、スクリプト内で PowerShell 関数パラメーターを使用するための 1つの手法です。名前付きパラメーターを使用してスクリプトまたは関数を呼び出すときは、引数の完全な名前を使用してください。

上記の PowerShell スクリプトが test.ps1 に保存されていると仮定します。ここでは、param1 と param2 に値を提供します。以下の例では、パラメーターのフルネームを渡す必要があることがわかります。

./test.ps1 -Param1 'value' -Param2 'valuenext'

出力:

画像-20211223173801745

このスクリプトを実行すると、次のようなものが表示されます。各引数変数は、実行時に指定された値に置き換えられます。

PowerShell 関数の位置パラメーター

名前の代わりに位置でアイテムを渡すことは、パラメーターを利用するもう 1つの方法です。位置を介してパラメーター値を渡す場合、パラメーターの名前は使用されません。代わりに、PowerShell は各引数の値を関数内の位置と比較します。PowerShell は、コード内で Param1 が Param2 の前に指定されていることを認識し、正しい順序で値を照合します。

./test.ps1 'value' 'valuenext'

出力

Param1 value value
Param 2 value is valuenext

上記の例では、param1 と param2 の両方が文字列型として宣言されていますが、使用できる型はこれだけではありません。.NET クラスライブラリの任意のタイプを使用できます。

元の順序とは別に、パラメーター構造内の位置を指定することによっても先に進むことができます。以下に示します。

param(
     [Parameter(position = 1)]
     [string]$Param1,
 
     [Parameter(position = 0)]
     [string]$Param2
 )
 
Write-Host "Param1 value is $Param1"
Write-Host "Param 2 value is $Param2"

ここでは、パラメータの順序が変更されていることがわかります。

./test.ps1 'param2' 'param1'

PowerShell 関数でパラメーターを切り替える

このパラメーターは、バイナリ値またはブール値を使用して、何かがオンかオフかを示すために使用されます。スイッチタイプはそれを指定するために使用されます。上記の例を続けて、DisplayParam2 という名前の別のスイッチパラメータを追加します。

param(
     [Parameter()]
     [string]$Param1,
 
     [Parameter()]
     [string]$Param2,
 
     [Parameter()]
     [switch]$DisplayParam2
 )
 
 Write-Host "Param1 value is $Param1"
 if ($DisplayParam2.IsPresent) {
     Write-Host "Param2 value is $Param2"
 }

出力:

PowerShell 関数のパラメーターを切り替えます

PowerShell 関数パラメーターでのスプラッティング

スプラッティングは、主にパラメータが多い場合に使用されます。コマンドを実行する前にスクリプトのパラメーターを設定することを、スプラッティングと呼びます。これまで、実行時に値を定義してパラメーターに渡してきました。以下に表示されるパラメーターのコレクションを取得すると、これが問題になる可能性があります。

param(
     [Parameter()]
     [string]$Param1,
 
     [Parameter()]
     [string]$Param2,
 
     [Parameter()]
     [switch]$DisplayParam2,
 
     [Parameter()]
     [string]$Param3,
 
     [Parameter()]
     [string]$Param4,
 
     [Parameter()]
     [string]$Param5,
 
     [Parameter()]
     [string]$Param6,
 
     [Parameter()]
     [string]$Param7
 )
 
Write-Host "Param1 value is $Param1"
if ($DisplayParam2.IsPresent) {
 Write-Host "Param2 value is $Param2"
}
Write-Host "Param3 value is $Param3"
Write-Host "Param4 value is $Param4"
Write-Host "Param5 value is $Param5"
Write-Host "Param6 value is $Param6"
Write-Host "Param7 value is $Param7"

以下に示すように、右にスライドするのではなく、ハッシュテーブルを使用して別のフェーズでパラメーター値を指定することもできます。パラメータ値はきちんと調整されているため、どのパラメータ値が使用されているかをはるかに簡単に理解できます。

ハッシュテーブルが確立されたら、ハッシュテーブルの名前の後に@文字を指定して、すべての引数をスクリプトに送信できます。

$params = @{
     Param1             = 'value'
     Param2             = 'valuenext'
     Param3             = 'somevalue'
     Param4             = 'somevalue'
     Param5             = 'somevalue'
     Param6             = 'somevalue'
     Param7             = 'somevalue'
     DisplayParam2 = $true
 }
 
 PS> ./test.ps1 @params

PowerShell パラメーター属性

パラメータ特性により、さまざまな方法でパラメータ機能を変更できます。正規表現を使用して正規表現を適合させ、特定のパラメーターの使用を義務付け、パラメーターに提供された値を検証することができます。

必須パラメーター

PowerShell では、必要に応じて、関数で実行される 1つ以上の属性を義務付けることができます。したがって、Parameter() 構造内で mandatory 属性を使用できます。

param(
     [Parameter(Mandatory)]
     [string]$Param1,
 
     [Parameter()]
     [string]$Param2,
 
     [Parameter()]
     [switch]$DisplayParam2
 )
 
Write-Host "Param1 value is $Param1"
if ($DisplayParam2.IsPresent) {
    Write-Host "Param2 value is $Param2"
}

出力:

PowerShell 関数の必須パラメーター

パラメータの検証

最後に、パラメータに指定された値が正しいことを再確認します。誰かがパラメータに一意の値を与える可能性を最小限に抑えるのに理想的です。したがって、以下に示すように、ValidateSet() を使用して必要な入力を指定できます。

param(
     [Parameter(Mandatory)]
     [ValidateSet('x', 'y')]
     [string]$Param1,
 
     [Parameter()]
     [string]$Param2,
 
     [Parameter()]
     [switch]$DisplayParam2
 )
 
 Write-Host "Param1 value is $Param1"
 if ($DisplayParam2.IsPresent) {
     Write-Host "Param2 value is $Param2"
 }

param1 に x と y 以外の値を指定すると、エラーがポップアップ表示されます。

名前付きパラメータ構文を使用した高度な関数

Cmdletbinding 属性が関数に追加されると、それは高度な関数に変わります。高度な関数を作成するときに、他の一般的な引数が使用されます。構文は次のとおりです。

function testfunction
{
    [CmdletBinding (DefaultParameterSetName='Param1')]
    Param
    (
         [Parameter(Mandatory=$true, Position=0, ParameterSetName='Param1')]
         [string] Param1,
         [Parameter(Mandatory=$true, Position=0, ParameterSetName='Param2')]
         [string] Param2,
    )
}
Migel Hewage Nimesha avatar Migel Hewage Nimesha avatar

Nimesha is a Full-stack Software Engineer for more than five years, he loves technology, as technology has the power to solve our many problems within just a minute. He have been contributing to various projects over the last 5+ years and working with almost all the so-called 03 tiers(DB, M-Tier, and Client). Recently, he has started working with DevOps technologies such as Azure administration, Kubernetes, Terraform automation, and Bash scripting as well.