今更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年にもなって、文字化けとはなんとも情けない話だ。そこで、この問題を考えてみることにした。
![ページャー](https://ascii.jp/img/2024/07/07/3760671/x/8a32bdb9edd4aa21.png)
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を呼んでいる。
![ページャー](https://ascii.jp/img/2024/07/07/3760669/x/2f15623b94953415.png)
PowerShell(ここでは、Ver.7.4.3を使った)では、「more」は、more.comを意味する。これは、「get-command more」で調べるとわかる。
![ページャー](https://ascii.jp/img/2024/07/07/3760670/x/ec03bfb3d54b6aff.png)
どちらの場合でも、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を使うように環境整備しておくと、作業効率が改善する。ファイルパスの補完と組み合わせて、短時間で確認できる。いちいちメモ帳を開くことも必要なくなる。
この記事に関連するニュース
-
そもそも「Copilot+ PC」とは何なのか?
ASCII.jp / 2024年7月14日 10時0分
-
Excelをノーコードで自動化しよう! パワークエリの教科書 第9回 Excelファイルからデータを取得する方法
マイナビニュース / 2024年7月8日 11時0分
-
Windowsはなぜ再起動が必要になるのか?
ASCII.jp / 2024年6月30日 10時0分
-
Windowsが今更(?)開発者に優しくなろうとしている!? 「Dev Home」は開発者にとって使い物になる?
ASCII.jp / 2024年6月23日 10時0分
-
人材紹介会社を装いマルウェアを配布するサイバー攻撃に注意
マイナビニュース / 2024年6月18日 11時31分
ランキング
-
1「酔っていました」 MLBオールスターの国歌斉唱に「ひどい」と批判 歌手が謝罪
ねとらぼ / 2024年7月17日 10時5分
-
2『ポケモンGO』激レアな“3ひきかぞく”の条件が気になる!ワッカネズミ初登場の「一家団欒イベント」重要ポイントまとめ
インサイド / 2024年7月17日 0時0分
-
3Xの動画「勝手に次も再生される」を防ぐ裏ワザ
ITmedia NEWS / 2024年7月17日 8時30分
-
4グーグル「Chrome」深刻度“高”の脆弱性10件に対応するアップデート
ASCII.jp / 2024年7月17日 13時0分
-
5iPhoneが海に落下...どうすれば? - いまさら聞けないiPhoneのなぜ
マイナビニュース / 2024年7月17日 11時15分
記事ミッション中・・・
記事にリアクションする
![](/pc/img/mission/mission_close_icon.png)
記事ミッション中・・・
記事にリアクションする
![](/pc/img/mission/point-loading.png)
エラーが発生しました
ページを再読み込みして
ください
![](/pc/img/mission/mission_close_icon.png)