以下のブログで「more」関数を使うより、「Out-Host -Paging」を使ったほうが良いよ。
って話が出ている。
Use Out-Host instead of More - Power Tips - PowerShell.com – PowerShell Scripts, Tips, Forums, and Resources
「more」はパイプライン入力の結果が全て出力されてから処理されるので時間が掛かる。
PS> dir c:\windows -Recurse -ErrorAction SilentlyContinue | more |
こんなコマンドを打つとフリーズでもしたような感じになってしまう。
「Out-Host -Paging」に変えて
PS> dir c:\windows -Recurse -ErrorAction SilentlyContinue | Out-Host -Paging |
で、めでたしめでたしなのだが、やはりここは関数にしてみたい。
単純に考えると、こんな感じ?
001 002 003 004 005 006 | Function more2 { $input | Out-Host -Paging } dir c:\windows -Recurse -ea 0 | more2 |
と思うのだが、これだと通常の「more」と同じ動作に戻ってしまう。
しからば、こんなん?
001 002 003 004 005 006 007 008 009 | Function more2 { process { $_ | Out-Host -Paging } } dir c:\windows -Recurse -ea 0 | more2 |
ん~、これだと1ファイルごとに表示されてしまい、Pigingも1ファイル毎の指定に解釈されて意味を成していない・・・。
あぁー、なんとなくこのパターンは見覚えがある。
すでに詳細は忘れてしまったが(笑)以下の技が使えそうな気がする。
PowerShell: ◆パイプライン入力・パラメータ入力対応のGridView出力関数を作る
自分で書いていおいて良く思い出せないのだが、適当にまねて作ってみた。
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 | function more2 { begin { $scriptCmd = {Out-Host -Paging } $steppablePipeline = $scriptCmd.GetSteppablePipeline() $steppablePipeline.Begin($true) } process { try { $steppablePipeline.Process($_) } catch { break; } } end { $steppablePipeline.End() } } dir c:\windows -Recurse | more2 |
自信は無いがとりあえずは使い物になりそう。
0 件のコメント:
コメントを投稿