2011年10月21日金曜日

◆Write-Progressでプログレスバーを表示する

特に実用性は無いが、指定した文字列をHELPから探す関数を使ってプログレスバーの使い方を確認する。

001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017

function Search-Help
{
   
param($pattern
)
   
   
$helpNames = Get-Help * | ?{$_.Category -ne "Alias"
} 
   
   
foreach($helpTopic in $helpNames
)
    {
       
$content = Get-Help -Full $helpTopic.Name | Out-String
        if($content -match $pattern
)
        {
           
$helpTopic | select name,synopsis
        }
    }
}


Search-Help フォーマット演算子

とりあえず必須パラメータだけを指定して表示するには以下の一行を追加すれば良い。
image

するとISEではバーが何も進まないダイアログを実行中の間だけ表示してくれる。
2011-10-21 19h32_51

また、コマンドラインでは以下のような表示になる。
image

無駄なバーが表示されないのでコマンドラインならこれでも良いかと思う。
ちなみに、PowerGUIで表示されるダイアログには無駄なバーは表示されなかった。

なにも動かないとちょっと寂しいのでこんな感じにしてもよいかも。

Write-Progress -activity "HELP検索"  `
  -Status ("検索中..." + "." * ($counter++ /10)) 

すると、ちょっとずつ進んでくれる。
image

せっかくのプログレスバーなので、その機能も使ってみるとこんな感じ。
PercentCompleteパラメータに現在の進捗率を指定してあげる。

Write-Progress -activity "HELP検索" -Status "検索中..."  `
    -PercentComplete ($pCounter++ * 100 /$helpNames.Count) 

image

CurrentOperationなるパラメータもあって、こいつに現在処理中のファイル名を指定してみる。

Write-Progress -activity "HELP検索" -Status "検索中..."  `
    -PercentComplete ($pCounter++ * 100 /$helpNames.Count) `
    -CurrentOperation ($helpTopic.Name)

インストーラー等でよくあるようにファイル名が意味もなく流れる。
image

SecondsRemainingパラメータを指定すると残り時間も表示できるので適当に計算して指定してみた。

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

function Search-Help
{
   
param($pattern
)
   
   
$helpNames = Get-Help * | ?{$_.Category -ne "Alias"
}
   
$STime = Get-Date
    $pCounter = $remaining = 0
    foreach($helpTopic in $helpNames
)
    {
       
$span = New-TimeSpan $STime (Get-Date
)
       
if($pCounter % 20 -eq 1){$remaining =
 
          (
$span.Seconds / $pCounter ) * ($helpNames.Count - $pCounter
)}
       
Write-Progress -activity "HELP検索" -Status "検索中..."
 `
           
-CurrentOperation ($helpTopic.
Name) `
           
-PercentComplete ($pCounter++ * 100 /$helpNames.
Count) `
           
-SecondsRemaining $remaining
 
           
       
$content = Get-Help -Full $helpTopic.Name | Out-String
        if($content -match $pattern
)
        {
           
$helpTopic | select name,synopsis
        }
    }
}


Search-Help フォーマット演算子
<!--EndFrag

image

IDパラメータというのもあって、こいつに適当な数値をキーとして指定することにより別のバーを追加することができる。(たまに凝ったインストーラーが表示するネストしたバーみたいなことができる)

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
039
040
041
042
043
044
045

function Search-Help
{
   
param($pattern
)
   
   
$helpNames = Get-Help * | ?{$_.Category -ne "Alias"} | sort Category
    $helpNames | Group Category |
 
     
%{$CatCount = @{}}{$CatCount.($_.Name) = $_.
Count}
   
   
$STime = Get-Date
    $pCounter = $remaining = 0
    $catStatus = "○" + (($CatCount.Keys | sort) -Join "○"
)
   
   
foreach($helpTopic in $helpNames
)
    {
       
$span = New-TimeSpan $STime (Get-Date
)
       
if($pCounter % 20 -eq 1){$remaining =
 
          (
$span.Seconds / $pCounter ) * ($helpNames.Count - $pCounter
)}
       
Write-Progress -activity "HELP検索(全体)" -Status "検索中..."
  `
           
-CurrentOperation ($helpTopic.
Name) `
           
-PercentComplete ($pCounter++ * 100 /$helpNames.
Count) `
           
-SecondsRemaining $remaining
 
           
       
if($prevCategory -ne $helpTopic.
Category)
        {
           
if($prevCategory
){
             
$catStatus =
 
               
$catStatus -replace ("○"+$prevCategory),("●"+$prevCategory
)
            }
           
$prevCategory = $helpTopic.
Category
           
$cCounter = 0
        }
       
       
Write-Progress -activity "HELP検索(Category)" -Status $catStatus
  `
         
-CurrentOperation ("({0}処理中)" -f $helpTopic.Category) -Id 1
  `
         
-PercentComplete ($cCounter++ * 100 /$CatCount[$helpTopic.Category]
) 
       
       
$content = Get-Help -Full $helpTopic.Name | Out-String
        if($content -match $pattern
)
        {
           
$helpTopic | select name,synopsis
        }
    }
}


Search-Help フォーマット演算子

image

ちょっと調子に乗って余計な処理まで追加したせいもあるが、ここまで来ると本来の処理よりプログレスバーの表示処理のほうが重くなってくる。

ケースバイケースで適切なレベルの表示をしたほうがよさそうだ。

0 件のコメント:

コメントを投稿