サーチ…


前書き

PowerShellにはオブジェクトパイプライニングモデルが導入されています。このモデルを使用すると、オブジェクト全体をパイプライン経由で消費してコマンドレットや(少なくとも)出力することができます。古典的な文字列ベースのパイプライニングとは対照的に、パイプオブジェクトの情報は特定の位置にある必要はありません。コマンドレットは、パイプラインからのオブジェクトと相互作用することを入力として宣言し、戻り値はパイプラインに自動的に送信されます。

構文

  • BEGIN最初のブロック。最初に1回実行されます。ここで入力されるパイプラインは、設定されていないため、$ nullです。
  • PROCESS 2番目のブロック。パイプラインの各要素に対して実行されます。パイプラインパラメータは、現在処理されている要素と同じです。
  • END最後のブロック。終了時に一度だけ実行されます。パイプラインパラメータは、設定されてから変更されていないため、入力の最後の要素と同じです。

備考

ほとんどの場合、パイプラインの入力はオブジェクトの配列になります。 PROCESS{}ブロックの動作はforeach{}ブロックのように見えるかもしれませんが、配列内の要素をスキップするには別のプロセスが必要です。

foreach{}ように、 PROCESS{}ブロック内でcontinueを使用すると、 END{}ブロックを含む次のすべてのステートメントをスキップしてパイプラインが中断されます。代わりに、 return使用します。現在の要素のPROCESS{}ブロックを終了し、次の要素に移動します。

場合によっては、異なる符号化の関数の結果を出力する必要があります。 CmdLetsの出力の符号化は、 $OutputEncoding変数によって制御されます。出力をネイティブアプリケーションへのパイプラインに入れることを意図している場合、ターゲットと一致するようにエンコーディングを修正することが望ましいでしょう。 $OutputEncoding = [Console]::OutputEncoding

その他の参考資料:

$OutputEncodingに関するより詳しい情報を含むブログ記事https://blogs.msdn.microsoft.com/powershell/2006/12/11/outputencoding-to-the-rescue/

高度なライフサイクルを持つ関数の作成

この例は、関数がパイプライン入力を受け入れ、効率的に反復する方法を示しています。

関数のbeginおよびend構造体はパイプライン処理時にはオプションですが、 ValueFromPipelineまたはValueFromPipelineByPropertyNameを使用する場合はそのprocessが必要です。

function Write-FromPipeline{
    [CmdletBinding()]
    param(
        [Parameter(ValueFromPipeline)]
        $myInput
    )
    begin {
        Write-Verbose -Message "Beginning Write-FromPipeline" 
    }
    process {
        Write-Output -InputObject $myInput
    }
    end {
        Write-Verbose -Message "Ending Write-FromPipeline"
    }
}

$foo = 'hello','world',1,2,3

$foo | Write-FromPipeline -Verbose

出力:

VERBOSE: Beginning Write-FromPipeline
hello
world
1
2
3
VERBOSE: Ending Write-FromPipeline

関数の基本パイプラインのサポート

これは、パイプライン化のためのサポートが最も単純な関数の例です。
以下に示すように、パイプラインをサポートしている関数には、ParameterAttribute ValueFromPipelineまたはValueFromPipelineByPropertyName設定された少なくとも1つのパラメータが必要です。

function Write-FromPipeline {
    param(
        [Parameter(ValueFromPipeline)]  # This sets the ParameterAttribute
        [String]$Input
    )
    Write-Host $Input
}

$foo = 'Hello World!'

$foo | Write-FromPipeline

出力:

Hello World!

注:PowerShell 3.0以降では、ParameterAttributesのデフォルト値がサポートされています。以前のバージョンでは、 ValueFromPipeline=$true指定する必要があります。

パイプラインの作業概念

パイプラインシリーズでは、各関数は並列スレッドのように他の関数と並列に実行されます。最初に処理されたオブジェクトは次のパイプラインに送信され、次の処理は別のスレッドで直ちに実行されます。これは、標準のForEachと比較して高速ゲインを説明しています

@( bigFile_1, bigFile_2, ..., bigFile_n) | Copy-File | Encrypt-File | Get-Md5
  1. step - 最初のファイルをコピーする( Copy-file Thread内)
  2. ステップ - 第2ファイルをCopy-fileスレッドにCopy-file 、同時に第1 Encrypt-FileEncrypt-File
  3. ステップ- (第三のファイルをコピーするCopy-fileスレッド)と同時に(第二のファイル暗号化するEncrypt-File )と同時にget-Md5 (の最初のGet-Md5


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow