しばたテックブログ

PowerShellを中心に気分で書いている技術ブログです。

Out-Host -Pagingについてのちょっとした話し

ちょっと今Out-Defaultの内部動作について調べてて、その最中に気が付いたことについてのメモになります。

Out-Hostの-Pagingパラメーター

Out-Hostコマンドレットの-Pagingパラメーターを使うと以下の様に1ページ、または1行ずつコンソールの表示を進めてくれる様になります。
要はPowerShell版のmoreコマンドです。

f:id:stknohg:20150928235438p:plain:w480

PowerShellでのmoreコマンド

ただこのOut-Host -PagingPowerShellでも普通にmoreコマンドは使えますしタイピングも面倒なので正直使いどころが無いと思います。実際私は全く使いません。

とはいえこんなパラメーターをわざわざ作ったという事は、もしかしたらmoreコマンドはOut-Host -Pagingエイリアスにでもなってるのではないかと思い少し調べてみました。

すると、

# Windows 10(PowerShell 5.0)での結果。
# PowerShell 2.0以降であれば同様の結果となります。
PS C:\> Get-Command more | fl


Name        : more
CommandType : Function
Definition  : param([string[]]$paths)

              $OutputEncoding = [System.Console]::OutputEncoding

              if($paths)
              {
                  foreach ($file in $paths)
                  {
                      Get-Content $file | more.com
                  }
              }
              else
              {
                  $input | more.com
              }

という結果が得られ、PowerShellでのmore(C:\WINDOWS\system32\)more.comをちょっとだけラップしたものだということがわかりました。

ここで上のコメントに

# Windows 10(PowerShell 5.0)での結果。
# PowerShell 2.0以降であれば同様の結果となります。

と入れているのは

d.hatena.ne.jp

の記事を見るとmoreファンクションはOut-Host -Pagingをラップしたものになっていたためです。
こちらの記事は2007年のものですのでPowerShell 1.0になります。

---- 2016/02/02追記 ----

PowerShell 1.0な環境を用意できたので確認してみました。

以下のコマンドで定義を取得。

Get-Command more -CommandType Function | select Definition

取得できた定義は以下。

param([string[]]$paths);

if(($paths -ne $null) -and ($paths.length -ne 0))
{
    foreach ($local:file in $paths)
    {
        Get-Content $local:file | Out-Host -p
    }
}
else
{
    $input | Out-Host -p
}

---- 追記ここまで ----

どういった経緯があったのかはわかりませんが、PowerShell 2.0になった時点でmoreファンクションでOut-Host -Pagingを使うのを止めて単純にmore.comをラップする様になりOut-Host -Pagingは完全にいらない子扱いにされてしまった様です。

---- 2015/09/29追記 ----

補足1 Out-Host -Pagingとmoreコマンドの違いについて

補足としてOut-Host -Pagingmoreファンクションの動作の違いについて触れておくと、moreファンクションは外部のmore.comコマンドを呼ぶ形になるのでパイプラインへの入力をすべて受けてからコマンドが実行される形になります。
このため大量データに対してはmoreの方がレスポンスタイムが悪くなりメモリの使用量が増大する事になります。

詳しい話はmore関数のレスポンスタイムを改善するを参照してください。

補足2 PowerShell ISEでのOut-Host -Pagingとmoreコマンドについて

I am having problems with the pipeline Out-Host -paging.にある様にPowerShell ISEではOut-Host -Pagingを実行するとエラーになります。

またmoreの定義も、

# PowerShell ISEで実行した結果です。
PS C:\> Get-Command more | fl


Name        : more
CommandType : Filter
Definition  :  $_ 

と、入力をすべて素通しするだけのFilterとなっています。
これは開発ツールとしてページングの処理をさせない様にしているのだと推測されます。

---- 追記ここまで ----

TODO

今回PowerShell 1.0の環境が用意できなかったのでいずれPowerShell 1.0についても実際に確認しておきたいです。 20160/02/02にPowerShell 1.0な環境で確認できました。