2011年3月31日木曜日

◆パラメータとパイプライン両方の入力に対応した関数を作る

Powershellのコマンドレットだとパイプライン入力と-InputObject引数に対応した物がよくある。
同様のものを関数で作ってみる。

まず、パイプライン入力の時にParamでパラメータを受け取るためには、[Parameter(ValueFromPipeline=$True)]属性を指定してやれば良さそうだ。

また、入力が配列の場合、パイプライン入力はProcessブロックで個々の処理が可能だが、パラメータ入力の場合は自分でループしてあげる必要がありそうだ。

というわけでサンプルとしてつくってみたのが以下だ。

001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027

function ftest{
 
#[CmdletBinding()]
  param
(
   
[Parameter(ValueFromPipeline=$True)]
    $arg1
  )
 
 
process
{
 
   
function proc($arg1
) {
     
Write-Host "arg1 = $arg1"
    }
   
   
if($arg1.
count){
     
$arg1 | %{proc $_
}
    }
else
{
     
proc $arg1
    }
   
  }
}


"■ Param Input"
ftest ("argstring1","argstring2")

"■ PipeLine Input"
("argstring1","argstring2") | ftest

なんとなく結果は良さそうだ。(これが汎用的かどうかはちょっと自信が無い)

■ Param Input
PS>ftest ("argstring1","argstring2")
arg1 = argstring1
arg1 = argstring2
PS>
PS>"■ PipeLine Input"
■ PipeLine Input
PS>("argstring1","argstring2") | ftest
arg1 = argstring1
arg1 = argstring2

--- 2014/8/1 -----

たまたま昔のこのブログを見る機会があったのだが、これって特に呼ばれるパターンを判定して処理をしなくても良さそう・・・。

バージョンによる違いなのか、当時なにか勘違いをしていたのか・・・。

以下にサンプルの雛形があるので参考に。

PowerTips

0 件のコメント:

コメントを投稿