PowerShell
PowerShellパイプラインの操作
サーチ…
前書き
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
- step - 最初のファイルをコピーする(
Copy-file
Thread内) - ステップ - 第2ファイルを
Copy-file
スレッドにCopy-file
、同時に第1Encrypt-File
をEncrypt-File
- ステップ- (第三のファイルをコピーする
Copy-file
スレッド)と同時に(第二のファイル暗号化するEncrypt-File
)と同時にget-Md5
(の最初のGet-Md5
)