パイプからの入力を許可することでぐっとPowerShellっぽくなります。
関数の引数をパイプラインから取得できるようにするためには、
引数の定義のところで設定をしておけばOKでした。
参考:PowerShellのパラメータ属性に関するメモ
実装する場合には、大雑把に以下の実装を行うこととなります。
①共通事前処理 → Beginブロック内
②オブジェクト個別の処理 → Processブロック内
③共通事後処理 → Endブロック内
ちなみに、パイプから流れてきたオブジェクトを
コレクションのまま処理したい場合、実装の流れは以下のようになります。
①でオブジェクトを受け入れるための配列を用意し、
②で用意した配列に順に値を詰めていき、
③に実施したい処理を書く。
実装例:
# Test-Pipeline.ps1
function Test-Pipeline
{
Param #パラメータ
( [int][Parameter(Mandatory = $True ,ValueFromPipeLineByPropertyName=$True)]$Length)
begin #共通事前処理
{ [int]$share = 0; "begin:" + $share.ToString() | Out-Host }
Process #オブジェクト個別の処理
{
[int]$local = 0; $local += $Length; $share += $Length;
$local.ToString() + "," + $share.ToString() | Out-Host
}
end #共通事後処理
{ "end:" + $share.ToString() | Out-Host }
}
"a",1,"bb","ccc" | Test-Pipeline
↓↓↓↓上記スクリプトの出力(若干歪んでいます)↓↓↓↓
begin:0
1,1
Test-Pipeline : 入力オブジェクトをコマンドのパラメーターにバインドできません。コマンドがパイプライン入力を受け入れないか、または入力とそのプロパティが、パイプライン入力を受け入
れるいずれのパラメーターにも一致しません。
発生場所 D:\Program Codes\MyPowerShell\test-pipe\test-pipe.ps1:16 文字:33
+ "a",1,"bb","ccc" | Test-Pipeline <<<<
+ CategoryInfo : InvalidArgument: (1:Int32) [Test-Pipeline]、ParameterBindingExcepion
+ FullyQualifiedErrorId : InputObjectNotBound,Test-Pipeline
2,3
3,6
end:6
参考コマンド:
Get-Help about_pipelines
修正履歴:
2010/1/28 コメントを緑色にしてみた。
0 件のコメント:
コメントを投稿