2011年12月29日木曜日

◆パイプライン入力・パラメータ入力対応のGridView出力関数を作る

PowerShell: ◆$inputの使い方PowerShell: ◆関数の作り方?で悩んでいたのですが、色々と試行錯誤の末、なんとなく解決策らしき方法を見つけました。

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
028
029
030
031
032
033
034
035
036
037
038

function slo {
 
[CmdletBinding()]
            
 
param
 (            
   
[parameter(ValueFromPipeline=$true)]
 
   
[object[]]$InputObject,
   
   
[parameter(Position=0)]
          
   
[string[]]$firstprop
 
  )
 
begin
  {
   
$steppablePipeline = {Out-GridView}.
GetSteppablePipeline()
   
$steppablePipeline.Begin($true
)
   
$proplist =
 @() 
  }
 
process
 { 
   
$steppablePipeline.Process((select-orderedList
)) 
  }
 
end { $steppablePipeline.
End() }
}


function select-orderedList
{
 
if($proplist.length -eq 0
) 
  {              
   
$proplist = $firstprop
 
   
$Inputobject | Get-Member -MemberType Property |
 
   
foreach
 { 
      
if($proplist -notcontains $_.
Name) 
       { 
          
$proplist += $_.
Name 
       } 
    } 
  } 
 
$InputObject | select-object -property $proplist
}

slo name -InputObject (ps)
ps  | slo name

スクリプトブロックの「GetSteppablePipeline」メソッドで「SteppablePipeline」オブジェクトを作ってあげると、あたかもパイプライン中で使用しているかのように入力オブジェクトを続けて渡せるようになるようです。
「Process」メソッドで1つずつ渡して行き、終わったら「End」メソッドを呼ぶ、といった感じのようです。

だいぶ手探りなので正解かどうかは判りませんが、とりあえずGridViewがウィルスのように湧いて出てくるのは回避できています。(^^;

ちょっと前に、PowerShell: ◆スクリプトブロックを使うを書いた時このメソッドの存在には気づいていたのですが、使い方が今ひとつ判っていませんでした。

これで今年もすっきり終われる、と思ったのですがパラメータで指定した時の結果が、こんな感じになってしまいます。
image

PS> ,(Get-Process) | Out-GridView

のように渡した状態ですね。

「SteppablePipeline」とかの使い方がおかしいのかと色々とまた悩んだのですが、何のことはない、

PS> Out-GridView  -inputobject (ps) 

とやると同じ結果になるじゃないですか・・・。

ん~、どういうことなんでしょう。バグ?

またまた、色々と調べた挙句、よくよくヘルプを見ると、
image

などときっぱり書いてある・・・。
ん~、そりゃ実質パラメータ指定には対応していないってことじゃないですかい・・・。

なんの為にこんなに苦労してきたのか(TT)

悔しいので、とりあえず「Out-File」に変更して、

  1. $steppablePipeline =
  2.     {Out-file -FilePath d:\documents\wk.txt}.GetSteppablePipeline()

こんな感じで確認したところ、一応OKっぽい感じでした。

なんとなく、今ひとつ報われない結果となりましたが、色々と助言を頂きながらパイプライン・関数・スクリプトブロックと少し理解が深まったような気がします。

1 件のコメント:

  1. おー、GetSteppablePipelineなんてのが使えるんですね。これは勉強になりました。

    返信削除