1. トップ
  2. 新着ニュース
  3. IT
  4. IT総合

今更more.comを使うのか!? Windowsでのページングを考える

ASCII.jp / 2024年7月10日 12時0分

 ページング(Paging)とは、コンソールなどで、画面の大きさに合わせて1画面分でスクロールを止め、キー入力などを使って、表示をさせるものだ。Windowsには、MS-DOS時代からのコマンドとしてmore.comがある。こうしたプログラムを「ページャー(Pager)」ともいう。

 しかし、このmore.comは、日本語表示はシフトJISしか対応しておらず、UTF-8エンコードやPowerShell標準のUnicodeエンコード(UTF-16 LE)にも対応していない。このため、渡される文字エンコードによっては文字化けしてしまう。2024年にもなって、文字化けとはなんとも情けない話だ。そこで、この問題を考えてみることにした。

ページャー
現在のWindowsにもmore.com自体は含まれているが、UTF-8の日本語テキストファイルを表示させると文字化けしてしまう

cmd.exeとmore.comの関係

 MS-DOS時代からあるmore.comは、「C:\Windows\System32\more.com」が実体である。拡張子がcomになっているが、中身は、EXE(PE)形式である。MS-DOSでは、ファイルサイズが64KB以下に限定されるが、簡易な実行ファイル形式があり、それがCOM形式と呼ばれていて、拡張子が.comだった。

 WindowsになりCOM実行ファイル形式はなくなり、そのうちCOMは、Component Object Modelのことを指すようになった。Microsoftはいつも略語を再利用する。その結果、古くからのユーザーほど混乱しやすくなるのは、なんとかしてほしいところだ。

 more.comは、そもそもcmd.exeで使うことを想定しており、日本語はシフトJISしか表示できない。しかし、cmd.exe用に作られたWindowsに付属する多くのコンソールコマンドは、大抵の場合、シフトJISしか出力しないので、これでも問題はなかったのだ。

 なお、Windowsのコンソールでは、実行ファイルの拡張子である「.exe」「.com」「.bat」は省略可能で、「more.com」は「more」で実行できる。

moreではなくlessを使う

 そんなmore.comだが、後戻りできないし、内部で検索することもできない。仕様としてはMS-DOS時代のままである。実際には、MS-DOS初期のmore.comは、ファイルパスを引数にすることができない純粋なフィルタコマンドだった。このため、typeコマンドなどと合わせてページングしていた。

 その点、現在のmore.comは、引数にファイルを指定することで、ファイル内容のページング表示ができる。この点では少しUnixのmoreに近づいた。

 UnixやLinuxでは、moreではなくlessを使うことが多い。個人の好みにもよるが、多くのユーザーがページャーにlessを指定するのが一般的だろう。

 lessは、moreという名前に「インスパイア」されて作られたコマンドである。多数のキー割当や設定項目があり、高性能なmoreとして動作する。現在Linuxで広く使われているのはGNUで開発されたlessである。

 GNU lessはオープンソースであり、Windowsにも移植されている。wingetコマンドで入手が可能だ。wingetなら安心というわけではないが、少なくともよく分からない「無料プログラム」サイトからダウンロードするよりはマシと思う。とはいえ、インストールをするのは素性を確認してからだ。Windows用のGNU lessに関しては、GitHubの「jftuga/less」(https://github.com/jftuga/less-Windows)にページがあり、リリースノートなどは「Less」(https://greenwoodsoftware.com/less/)にある。これは、

winget show jftuga.less

で得られる情報である。インストールは、

winget install jftuga.less

でできる。

 ただし、wingetで取得したパッケージには実行ファイル(less.exeとlesskey.exe)だけがある。前記のGitHubのreleaseからzipファイル(less-x64.zip)をダウンロードして、中にあるmanページ(*.manファイル)を取り出しておくといいだろう。拡張子はmanになっているが、整形されたテキストファイルになっている。

 より簡易に、WSLのmanコマンド(man less)を使う方法もある。GNU lessは、比較的アップデートが頻繁である。しかし、LinuxディとスリビューションのLTS(Long Term Support)版では、重大なバグがない限り、開発時点で選択されたバージョンのlessに止まり続ける。

 このため、WSLのUbuntuなどでもlessのバージョンが、wingetで導入したlessよりも古いバージョンになることがある。wingetでは、常に最新版のlessをインストールするからだ。

 Windowsでlessを使う場合に注意が必要なのは、文字エンコードだ。less.exeの文字エンコードは、環境変数LESSCHARSETで指定する。シフトJISの場合には、「DOS」を指定する。

 UTF-8がデフォルトの文字エンコードだが、LESSCHARSETに「utf-8」を指定することもできる。cmd.exeでも使うのであれば、環境変数の設定(「設定」→「システム」→「バージョン情報」→「システムの詳細設定」)で「DOS」を指定しておき、PowerShellのプロファイルで「utf-8」を指定する。

 lessは、設定や起動オプションでさまざまな機能を利用できる。「--help」で簡易なオプションを表示でき、「man less」をインターネット検索すると、日本語man pageなどが見つかる。

 行番号の表示(-Nオプション)や、表示対象が画面サイズ以下だった場合にページングしないで終了(-Fオプション)、UNIXのmoreのような詳しいプロンプト(-mオプション)などを指定すると便利。環境変数LESSで指定しておくことも可能だ。

PowerShellには組み込みのページャーがある

 PowerShell/Windows PowerShellには組み込みのページャーがある。パイプラインの最後に「Out-Host -Paging」付けることでページングがなされる。ただし、筆者の環境では、コマンド実行時のEnterキーを取ってしまうのか、最初のページのみ、1回Enterキーが入力された状態になり、ちょっとバグっぽい(最新版でも、言語を英語にしても同じ)。

 とはいえ、ちょっと見にくいだけであり、なんと言っても標準機能なのでインストールしないで利用でき、PowerShell/Windows PowerShell文字エンコード(Unicode)に対応している。トラブル対策に覚えておきたい。

 また、以前にも以下の記事で解説したが(「コマンドの出力が長いとき、PowerShellではとりあえずselect-objectでなんとかする」)、Out-GridViewを使うと、別ウィンドウにパイプラインを出力できる。ファイルを表示させる場合には、

Get-Content .\less.man | Out-GridView

などとして、ファイル内容をGet-Contentコマンドで取り出して、Out-GridViewに入れてやる。

 PowerShellとWindows PowerShellでは、「more」の扱いが異なる。Windows PowerShell(Ver.5.1.22621.3672)では、「more」は、組み込みの関数になっているが、内部でmore.comを呼んでいる。

ページャー
Windows PowerShellでは、moreは関数(Function)として定義されている。しかし、その中でmore.comを呼び出して使っている

 PowerShell(ここでは、Ver.7.4.3を使った)では、「more」は、more.comを意味する。これは、「get-command more」で調べるとわかる。

ページャー
PowerShellでは、moreは、more.comである。ただし、標準搭載のhelp関数が内部でmore.comを使っていて、環境変数$env:PAGERで指定したページャープログラムに差し替え可能だ。逆に言えば、環境変数$env:PAGERを指定しない場合、more.comが使われる

 どちらの場合でも、more.comと指定することで、「C:\Windows\System32\more.com」が起動する。

 PowerShellでは、HELPコマンド(HELP関数)が内部的にmore.comを利用している。内部をみると、環境変数PAGERにコマンドを指定すれば、これをページャーとして利用するようだ。

 more.comの場合にless.exeを使いたい場合、手っ取り早いのは、「more」のエイリアスとしてless.exeを指定することだ。また、HELPコマンド向けとして環境変数PAGERにもless.exeを指定する。どちらの場合もless.exeに対するPATH設定は行われていると仮定している。以下の2行をプロファイルで指定しておくといいだろう。

set-alias -Name more -Value less.exe $env:PAGER=less.exe

 これで、「dir | more」などとすると、lessでページングされる。なお、moreの後ろにオプションを付けることもできる。たとえば行番号をつけたいなら「dir | more -n」などとする。

 moreやlessは、テキストファイルの中身をのぞくのに使うため、利用頻度も低くない。1回less.exeを使うように環境整備しておくと、作業効率が改善する。ファイルパスの補完と組み合わせて、短時間で確認できる。いちいちメモ帳を開くことも必要なくなる。

この記事に関連するニュース

トピックスRSS

ランキング

記事ミッション中・・・

10秒滞在

記事にリアクションする

記事ミッション中・・・

10秒滞在

記事にリアクションする

デイリー: 参加する
ウィークリー: 参加する
マンスリー: 参加する
10秒滞在

記事にリアクションする

次の記事を探す

エラーが発生しました

ページを再読み込みして
ください