ちょっと今Out-Default
の内部動作について調べてて、その最中に気が付いたことについてのメモになります。
Out-Hostの-Pagingパラメーター
Out-Hostコマンドレットの-Paging
パラメーターを使うと以下の様に1ページ、または1行ずつコンソールの表示を進めてくれる様になります。
要はPowerShell版のmore
コマンドです。
PowerShellでのmoreコマンド
ただこのOut-Host -Paging
、PowerShellでも普通に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以降であれば同様の結果となります。
と入れているのは
の記事を見ると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 -Paging
とmore
ファンクションの動作の違いについて触れておくと、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な環境で確認できました。