route.exe のヘルプを見ようと思い、以下のように入力しましたが、画面が流れてしまい、コマンドラインのヘルプを見る事ができません。理由と対策を教えてください。
c:\> route | more
直接の原因は, route.exe はコンソールへの出力を標準エラー出力に出力しているにもかかわらず, パイプ(|) を使って標準出力への出力を more コマンドに渡しているためです。
通常コマンドがコンソールに文字を出力する時は, 標準出力という仮想的なファイルに対して, 書き込みを行う事で実現していますが, 標準エラー出力という仮想的なファイルに対して出力を行ってもコンソールに文字列を出力する事が可能な仕様になっています。
標準出力, 標準エラー出力の概念は, もともと UNIX で, コマンドの出力をエラー出力と正常な出力とに分けて出力することで, コマンド間の連係を行いやすくしようとして生まれたようです。マイクロソフトは, この仕組みを MS-DOS 2.0 から採り入れており, Windows NT でもこの仕組みが採り入れられています。
マニュアルなどには明記されておりませんが、 Windows NT でもリダイレクト記号 (>) を用いる際に "2>" という記述を行うことで, 明示的に標準エラー出力を取り出す事が可能です。
例えば, route.exe の出力をファイルにする場合は, 以下のように行います。
c:\> route 2> route.txt
標準出力と標準エラー出力の両方に出力を行うようなコマンドの場合も, 以下のようにする事で, 両方を別々に取得できます。
c:\> (complex.exe 2> stderr.txt) > stdout.txt
上記の例では標準出力と標準エラー出力とに出力を行うコマンド(仮に complex.exe とします)の出力を、
同様にして標準エラーー出力を標準出力にリダイレクトする事も可能です。従って, 以下のようにする事で, route.exe の出力を more で見ることができるようになります。
c:\> route 2>&1 | more
&1 という表記は標準出力を表します。従って、上記コマンドは標準エラー出力(ファイルハンドル 2) を 標準出力(1) にリダイレクトし、それを | で more に読み込ませている事になります。
しかし, このような複雑な事をしなくても, コマンドプロンプトの領域そのものを拡張する事によって, 流れてしまった出力を遡って見ることが可能です。
[コントロールパネル] - [コンソール] から [レイアウト] タブを見ると, 画面バッファサイズという項目がありますので、図1のように、ここを非常に大きな値(例えば 2000)にしてから, コマンドプロンプトを開いてください。コマンドプロンプトの横にスクロールバーが付与されているのが確認できます。
図1: 画面バッファの設定
この設定を行なうと [レイアウト] タブ内の「ウインドウのサイズ」の高さが 25 のままだったとしても, 画面バッファのサイズで設定した値分の行数がメモリに保存されていますので, スクロールバーで過去の出力結果をたどる事で, route.exe の出力結果も見ることが可能になります。
もちろん、ウインドウサイズそのものを広げる事で、より広い行数を一度に見ることも可能です。ウインドウサイズは, 画面バッファサイズを越えない範囲で設定します。
なお, 画面バッファの行数は最大 9999 行まで設定できますが, あまり大きな数を指定すると, 余分なメモリが必要だというメッセージが表示されます。
幅80行の場合は, 6553 行を越えるとこのメッセージが表示されますので, これ以下に設定しておくのがよいでしょう。
Windows NT のコマンドプロンプトは, その他にもいろいろ機能拡張されています。 しかし、デフォルトでは過去との互換性を保つ目的からか、それらの便利な拡張機能のほとんどがオフにされた状態で提供されている上に, 拡張機能そのものについてもあまり説明されていないため、結局標準のまま使っている方が大部分のように思います。
以下筆者が日常の作業で使っている設定を幾つか紹介しますので、是非使って頂きたいと思います。
HKEY_CURRENT_USER\Software\Microsoft\Command Processorというキー中の CompletionChar の値を 9 にして下さい (9 という数字は,[TAB] キーの ASCII コードを表します) 。
この他, Windows NT のコマンドプロンプトには、ファンクションキーを使ったヒストリ操作や doskey コマンドを使ったマクロ等、 UNIX のシェルに匹敵するような機能がいろいろ実装されていますが、とりあえず上にあげた機能を使うだけでも、デフォルトの状態と比べればコマンドプロンプトの使い勝手はかなり向上すると思います。
Windows NT の管理を行っていると、運用の自動化やバッチ処理などの一貫として、コマンドライン上での作業を行う機会も多いと思います。
コマンドラインだから使い勝手が悪いという先入観をもたずに、一度コマンドプロンプトの機能を見直してみてはいかがでしょうか?