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ファイルにComputerName
とVersion
のフィールドが含まれていると仮定しましょう。
プロパティ名でのバインディングを示すために、これらのプロパティを含む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
関数を更新して、プロパティ名でVersion
とComputerName
を受け入れるようにします。
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
各行のComputerName
とVersion
フィールドは、関数内のそれぞれのパラメーターにバインドされます。このアプローチにより、バージョン管理を伴う複数のコンピュータに対するソフトウェアインストールの一括処理が容易になります。
結論
このチュートリアルでは、PowerShell関数でパイプラインサポートを有効にする方法を学びました。これにより、関数はより多様で強力になります。今では、組み込みのコマンドレットと同様に、パイプラインからデータをシームレスに受け入れるカスタム関数を設計できます。
パイプライン対応の関数を使用することで、データ入力に対する細かな制御が可能になり、スクリプトの設計が簡素化され、可読性が向上します。
PowerShellを使い続ける中で、これらの技術を統合して、効率的でパイプライン対応の関数を書くことを検討してください。スクリプトをより柔軟で効果的にし、タスクの自動化を実現しましょう!
Source:
https://adamtheautomator.com/powershell-pipeline-parameters/