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: ◆スクリプトブロックを使うを書いた時このメソッドの存在には気づいていたのですが、使い方が今ひとつ判っていませんでした。
これで今年もすっきり終われる、と思ったのですがパラメータで指定した時の結果が、こんな感じになってしまいます。
PS> ,(Get-Process) | Out-GridView |
のように渡した状態ですね。
「SteppablePipeline」とかの使い方がおかしいのかと色々とまた悩んだのですが、何のことはない、
PS> Out-GridView -inputobject (ps) |
とやると同じ結果になるじゃないですか・・・。
ん~、どういうことなんでしょう。バグ?
などときっぱり書いてある・・・。
ん~、そりゃ実質パラメータ指定には対応していないってことじゃないですかい・・・。
なんの為にこんなに苦労してきたのか(TT)
悔しいので、とりあえず「Out-File」に変更して、
- $steppablePipeline =
- {Out-file -FilePath d:\documents\wk.txt}.GetSteppablePipeline()
こんな感じで確認したところ、一応OKっぽい感じでした。
なんとなく、今ひとつ報われない結果となりましたが、色々と助言を頂きながらパイプライン・関数・スクリプトブロックと少し理解が深まったような気がします。
おー、GetSteppablePipelineなんてのが使えるんですね。これは勉強になりました。
返信削除