PowerShell パイプラインパラメータ: パイプライン対応の関数を作成する方法

PowerShellのパイプラインがどのように機能し、組み込みのcmdletがデータを1つのコマンドから別のコマンドに渡す方法を調査したことがあるかもしれません。しかし、自分自身のカスタム関数を作成し、それもパイプラインを使用することができることを知っていましたか? はい!パラメータバインディングを使用すると、あなたの関数は組み込みのcmdletと同様に振る舞い、シームレスにパイプラインからデータを受け入れることができます。

このチュートリアルでは、あなたのカスタム関数にパイプラインの力を与える方法を案内します。これにより、PowerShellスクリプトを自動化し、構造化する方法が変わります。

ループや手動入力に頼る代わりに、スクリプト作成の効率と柔軟性を向上させましょう!

ValueFromPipelineを使用したパイプライン入力の有効化

関数がパイプラインから情報を受信するためには、1つ以上のパラメータをそのように受け入れるように構成する必要があります。パラメータをValueFromPipelineまたはValueFromPipelineByPropertyName属性を使用するように構成します。

まず、複数のコンピュータにソフトウェアをインストールする関数を設定し、ループを使用せずにコンピュータ名の配列を渡す方法を始めましょう。

ValueFromPipeline属性をComputerNameパラメータに追加し、各入力パイプラインオブジェクトをComputerNameパラメータとして扱えるようにします。

この設定で、PowerShellは各入力パイプラインオブジェクトを$ComputerNameにバインドします。

function Install-Software {
    param(
        [Parameter(Mandatory)]
        [ValidateSet(1,2)]
        [int]$Version,

        [Parameter(Mandatory, ValueFromPipeline)]
        [string]$ComputerName
    )
    process {
        Write-Host "I installed software version $Version on $ComputerName. Yippee!"
    }
}

それでは、パイプラインを使用して関数にコンピュータ名の配列を渡してみましょう。

$computers = @("SRV1", "SRV2", "SRV3")
$computers | Install-Software -Version 1

processブロックがないと、関数は最後のアイテムのみを処理します。processブロックは、関数が配列内の各アイテムを独立して処理できるようにします。

ValueFromPipelineByPropertyNameによるプロパティ名でのバインディング

パイプラインオブジェクトに、関数のパラメーターと一致する必要がある複数のプロパティがある場合を考えましょう。もしそうなら、CSVファイルにComputerNameVersionのフィールドが含まれていると仮定しましょう。

プロパティ名でのバインディングを示すために、これらのプロパティを含むCSVファイルを保存することから始めます:

@(
    [pscustomobject]@{'ComputerName' = 'SRV1'; 'Version' = 1}
    [pscustomobject]@{'ComputerName' = 'SRV2'; 'Version' = 2}
    [pscustomobject]@{'ComputerName' = 'SRV3'; 'Version' = 2}
) | Export-Csv -Path C:\Scripts\software_installs.csv -NoTypeInformation

関数を更新して、プロパティ名でVersionComputerNameを受け入れるようにします。

ValueFromPipelineByPropertyNameを使用すると、関数内のパラメーターとCSVからインポートされたオブジェクトのプロパティが一致します。

function Install-Software {
    param(
        [Parameter(Mandatory, ValueFromPipelineByPropertyName)]
        [ValidateSet(1,2)]
        [int]$Version,

        [Parameter(Mandatory, ValueFromPipelineByPropertyName)]
        [string]$ComputerName
    )
    process {
        Write-Host "I installed software version $Version on $ComputerName. Yippee!"
    }
}

次に、Import-Csvを使用してファイルをインポートし、各オブジェクトをInstall-Softwareにパイプします。

Import-Csv -Path C:\Scripts\software_installs.csv | Install-Software

各行のComputerNameVersionフィールドは、関数内のそれぞれのパラメーターにバインドされます。このアプローチにより、バージョン管理を伴う複数のコンピュータに対するソフトウェアインストールの一括処理が容易になります。

結論

このチュートリアルでは、PowerShell関数でパイプラインサポートを有効にする方法を学びました。これにより、関数はより多様で強力になります。今では、組み込みのコマンドレットと同様に、パイプラインからデータをシームレスに受け入れるカスタム関数を設計できます。

パイプライン対応の関数を使用することで、データ入力に対する細かな制御が可能になり、スクリプトの設計が簡素化され、可読性が向上します。

PowerShellを使い続ける中で、これらの技術を統合して、効率的でパイプライン対応の関数を書くことを検討してください。スクリプトをより柔軟で効果的にし、タスクの自動化を実現しましょう!

Source:
https://adamtheautomator.com/powershell-pipeline-parameters/