PowerShell で CmdletBinding 属性を使用する

Migel Hewage Nimesha 2023年1月30日
  1. PowerShell の CmdletBinding 属性
  2. Verbose パラメータで CmdletBinding 属性を使用する
  3. $PSCmdlet オブジェクトと SupportsShouldProcessCmdletBinding 属性を使用する
  4. CmdletBinding 属性を Parameter 属性とともに使用して、関数パラメーターを制御する
PowerShell で CmdletBinding 属性を使用する

cmdlet は、PowerShell 環境内で単一の機能を実行する軽量のスクリプトです。cmdlet は、任意の .Net 言語で記述できます。

通常、cmdlet は、コマンドを実行するための動詞と名詞のペアとして表されます。このコマンドは、基盤となるオペレーティングシステムに対して、エンドユーザーが特定のサービスを実行するための命令です。

PowerShell 環境には、New-ItemMove-ItemSet-LocationGet-Location などの 200 を超える基本的な cmdlet が含まれています。cmdlet は、単純な PowerShell 関数では使用できない共通の機能セットを共有します。

  1. -WhatIfErrorActionVerbose などの一般的なパラメータをサポートします。
  2. 確認のためのプロンプト
  3. 必須のパラメーターのサポート

PowerShell の CmdletBinding 属性

単純な PowerShell 関数は、上記の基本的な cmdlet 機能を継承することにより、高度な関数として記述できます。CmdletBinding 属性を使用すると、これらの基本的な cmdlet 機能にアクセスできます。

以下に、すべての可能な引数を含む CmdletBinding 属性構文を示します。

{
    [CmdletBinding(ConfirmImpact=<String>,
    DefaultParameterSetName=<String>,
    HelpURI=<URI>,
    SupportsPaging=<Boolean>,
    SupportsShouldProcess=<Boolean>,
    PositionalBinding=<Boolean>)]

    Param ($myparam)
    Begin{}
    Process{}
    End{}
}

Helloworld-To-UpperCase と呼ばれる単純な PowerShell 関数があるとしましょう。

Function Helloworld-To-UpperCase {
    "helloworld".ToUpper();
}

この関数に関連付けられているパラメーターはありません。したがって、これは単純な PowerShell 関数と呼ばれます。

ただし、次のように、CmdletBinding 属性を使用してこの関数を高度な関数に変換し、基本的な cmdlet 機能とパラメーターにアクセスできます。

Function Helloworld-To-UpperCase {
    [CmdletBinding()]Param()
    "helloworld".ToUpper();
}

Helloworld-To-UpperCase 関数は、すべての基本的な cmdlet 機能を継承する高度な関数に変換されました。この関数では、基本的な cmdlet パラメーターを使用できます。

PowerShell ウィンドウで - を使用してこの関数を呼び出すと、cmdlet からのすべての一般的なパラメーターが一覧表示されます。

helloworld-to-uppercase -

出力:

コマンドレットパラメータ

共通の cmdlet パラメータと機能を高度な機能内で使用して、機能を拡張できます。

Verbose パラメータで CmdletBinding 属性を使用する

-verbose は、高度な機能の実行時にメッセージを表示できる貴重な共通パラメーターの 1つです。

Function Helloworld-To-UpperCase {
    [CmdletBinding()]Param()

    Write-Verbose "This is the common parameter usage -Version within our Helloworld-To-UpperCase function"

    "helloworld".ToUpper();
}

-verbose パラメータを使用して上記の関数を呼び出すと、すべての Write-Verbose 文字列が PowerShell ウィンドウに出力されます。

HelloWorld-To-UpperCase -Verbose

出力:

詳細パラメータを使用した CmdletBinding

$PSCmdlet オブジェクトと SupportsShouldProcessCmdletBinding 属性を使用する

CmdletBinding 属性を使用したので、高度な関数は手間をかけずに $PSCmdlet オブジェクトにアクセスできます。このオブジェクトには、ShouldContinueShouldProcessToStringWriteDebug などのいくつかのメソッドが含まれています。

ShouldContinue メソッドで CmdletBinding 属性を使用する

この方法により、ユーザーは確認要求を処理できます。それまでの間、SupportsShouldProcess 引数を $True に設定する必要があります。

ShouldContinue メソッドにはいくつかのオーバーロードされたメソッドがあり、2つのパラメーターを持つメソッドを使用します。

Function Helloworld-To-UpperCase {
    [CmdletBinding(SupportsShouldProcess=$True)]Param()

    Write-Verbose "This is the common parameter usage -Version within our Helloworld-To-UpperCase function"

    if ($PSCmdlet.ShouldContinue("Are you sure on making the helloworld all caps?", "Making uppercase with ToUpper")) {
        "helloworld".ToUpper();
    } Else {
        "helloworld kept in lowercase."
    }
}

-Confirm パラメータを使用して関数を呼び出すと、次のような確認ボックスが表示されます。

HelloWorld-To-UpperCase -Confirm

出力:

shouldContinue メソッド 1 を使用した CmdletBinding

ユーザーがはいをクリックした場合、if ブロックにメソッドを実装し、helloworld 文字列を大文字で出力する必要があります。

shouldContinue メソッド 2 を使用した CmdletBinding

そうでない場合は、helloworld は小文字で保持されますというメッセージが表示されます。

shouldContinue メソッド 3 を使用した CmdletBinding

CmdletBinding 属性を Parameter 属性とともに使用して、関数パラメーターを制御する

高度な関数に 1つのパラメーターを文字列として受け取らせるようにしましょう。

Function Helloworld-To-UpperCase {
    [CmdletBinding(SupportsShouldProcess=$True)]
    Param([string]$word)

    Write-Verbose "This is the common parameter usage -Version within our Helloworld-To-UpperCase function"

    if ($PSCmdlet.ShouldContinue("Are you sure on making the helloworld all caps?", "Making uppercase with ToUpper")) {
        $word.ToUpper();
    } Else {
        "helloworld kept in lowercase."
    }
}

Helloworld-To-UpperCase 関数を変更して、$word と呼ばれる 1つの文字列タイプのパラメーターを取得します。関数が呼び出されたら、引数として文字列を指定する必要があります。

提供されたテキストは大文字に変換されます。ユーザーがテキスト引数を指定していない場合、関数は空の出力を返します。

これを制御するには、$word パラメーターを必須にし、パラメーターの位置を 0 にします。

Function Helloworld-To-UpperCase {
    [CmdletBinding(SupportsShouldProcess=$True)]
    Param(
    [Parameter(
        Mandatory=$True, Position=0
    ) ]
    [string]$word
    )

    #Verbose
    Write-Verbose "This is the common parameter usage -Version within our Helloworld-To-UpperCase function"

    #If/Else block for request processing
    if ($PSCmdlet.ShouldContinue("Are you sure on making the helloworld all caps?", "Making uppercase with ToUpper")) {
        $word.ToUpper();
    } Else {
        "helloworld kept in lowercase."
    }
}

$word パラメータの動作を制御するためにいくつかのフラグを追加しました。必須なので、関数の実行時に文字列値を指定する必要があります。

HelloWorld-To-UpperCase -Confirm "stringtouppercase"

テキスト引数を指定しない場合、PowerShell はそれを要求し続けます。

CmdletBinding パラメータ属性

次の Parameter 属性構文に示すように、いくつかのフラグを使用して関数のパラメーターを制御できます。

 Param
(
    [Parameter(
        Mandatory=<Boolean>,
        Position=<Integer>,
        ParameterSetName=<String>,
        ValueFromPipeline=<Boolean>,
        ValueFromPipelineByPropertyName=<Boolean>,
        ValueFromRemainingArguments=<Boolean>,
        HelpMessage=<String>,
     )]
    [string[]]
    $Parameter1
)
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.