2014年11月11日火曜日

◆more関数のレスポンスタイムを改善する

以下のブログで「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 件のコメント:

コメントを投稿