標準エラー出力をハンドルする - NTコマンドプロンプトの機能紹介

対象プラットフォーム

質問

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 とします)の出力を、

出力しています。
なお 2 というのは, 伝統的に標準エラー出力に割り当てられているファイルハンドルの番号です。他に 1 が標準出力, 0 が標準入力に割り当てられています。

同様にして標準エラーー出力を標準出力にリダイレクトする事も可能です。従って, 以下のようにする事で, route.exe の出力を more で見ることができるようになります。

  c:\> route 2>&1 | more

&1 という表記は標準出力を表します。従って、上記コマンドは標準エラー出力(ファイルハンドル 2) を 標準出力(1) にリダイレクトし、それを | で more に読み込ませている事になります。

コマンドプロンプトの領域そのものを拡張する方法も

しかし, このような複雑な事をしなくても, コマンドプロンプトの領域そのものを拡張する事によって, 流れてしまった出力を遡って見ることが可能です。

[コントロールパネル] - [コンソール] から [レイアウト] タブを見ると, 画面バッファサイズという項目がありますので、図1のように、ここを非常に大きな値(例えば 2000)にしてから, コマンドプロンプトを開いてください。コマンドプロンプトの横にスクロールバーが付与されているのが確認できます。


図1: 画面バッファの設定

この設定を行なうと [レイアウト] タブ内の「ウインドウのサイズ」の高さが 25 のままだったとしても, 画面バッファのサイズで設定した値分の行数がメモリに保存されていますので, スクロールバーで過去の出力結果をたどる事で, route.exe の出力結果も見ることが可能になります。
もちろん、ウインドウサイズそのものを広げる事で、より広い行数を一度に見ることも可能です。ウインドウサイズは, 画面バッファサイズを越えない範囲で設定します。 なお, 画面バッファの行数は最大 9999 行まで設定できますが, あまり大きな数を指定すると, 余分なメモリが必要だというメッセージが表示されます。 幅80行の場合は, 6553 行を越えるとこのメッセージが表示されますので, これ以下に設定しておくのがよいでしょう。

機能拡張されている NT のコマンドプロンプト

Windows NT のコマンドプロンプトは, その他にもいろいろ機能拡張されています。 しかし、デフォルトでは過去との互換性を保つ目的からか、それらの便利な拡張機能のほとんどがオフにされた状態で提供されている上に, 拡張機能そのものについてもあまり説明されていないため、結局標準のまま使っている方が大部分のように思います。

以下筆者が日常の作業で使っている設定を幾つか紹介しますので、是非使って頂きたいと思います。

  1. ヒストリーと行編集機能
    コマンドプロンプトで上下の矢印キーを押すことで, 以前実行したコマンドを呼び出すことができます。 また, 左右のキーを押す事で、コマンドラインの編集を行う事ができます。 その他 Insert, Delete, Home, End, Page Up, Page Down 等のキーも使用可能です。
    MS-DOS で doskey.exe を使っていたり、UNIX で bash や tcsh 等を使用している方などにとっては当り前の機能ですが、筆者の周りを見ても意外と知らない方が多いようです。
  2. 挿入モードと簡易編集モード
    いずれも [オプション] タブ中にあります。 これらをチェックするか否かは好みの問題もありますが、最近のアプリケーションはほとんど全て挿入モードがデフォルトになっているため、少なくとも [挿入モード] はチェックをしておいた方が行編集機能を使用した作業がしやすいと思います。
  3. title コマンド
    画面が狭い場合に複数のコマンドプロンプトを使い分けたりしている場合など、取り敢えず使っていないウインドウをアイコン化しておくことがありますが、これでは、後で区別が付かなくなってしまい、いちいちウインドウを開いて確認することになってしまいます。 こんな時に title コマンドを使って、あらかじめコマンドプロンプトのウインドウに個別のタイトルを設定しておくと便利です。
  4. コンプリーション(文字列補完)機能
    これも、 UNIX 上で bash や tcsh 等を使っている方にはなじみのある機能です。 Windows NT でも、以下のレジストリの設定を行う事で、ファイル(フォルダを含む。以下同じ)名を途中まで入力して [TAB] キーを押すことで残りの部分を補完してくれるようになります。レジストリの
    HKEY_CURRENT_USER\Software\Microsoft\Command Processor 
    
    というキー中の CompletionChar の値を 9 にして下さい (9 という数字は,[TAB] キーの ASCII コードを表します) 。
    この設定を行うと、以後ファイル(フォルダ)名を中途まで入力して [TAB] キーを押すたびに、補完対象のファイル名の候補を順番に表示してくれます。何もファイル名を入力しない状態で [TAB] キーを押すと, そのフォルダ内の全てのファイルが対象になります。 長いファイル名や, 日本語のファイル名などを扱わないといけない時に, 大変便利です。
    なお、この機能は、Windows XP 以降デフォルトで有効になっています。
  5. ファイル名のドラッグアンドドロップ
    エクスプローラ等からコマンドプロンプトにファイルをドラッグアンドドロップすると、該当のファイル名がコマンドプロンプトのカーソル以後に表示されます。
    こちらも長いファイル名や, 日本語のファイル名などを扱わないといけない時に, 大変便利です。

この他, Windows NT のコマンドプロンプトには、ファンクションキーを使ったヒストリ操作や doskey コマンドを使ったマクロ等、 UNIX のシェルに匹敵するような機能がいろいろ実装されていますが、とりあえず上にあげた機能を使うだけでも、デフォルトの状態と比べればコマンドプロンプトの使い勝手はかなり向上すると思います。
Windows NT の管理を行っていると、運用の自動化やバッチ処理などの一貫として、コマンドライン上での作業を行う機会も多いと思います。 コマンドラインだから使い勝手が悪いという先入観をもたずに、一度コマンドプロンプトの機能を見直してみてはいかがでしょうか?

注記・補足

  1. Windows 2000 以降、コマンドプロンプトの標準設定が変更され、ここで説明した設定の幾つかは、デフォルトで有効な状態で提供されるようになっています。
  2. Windows XP の route.exe は標準エラー出力ではなく、標準出力に出力を行なうようになりましたので、ここで説明するテクニックを使わなくても出力を参照することが可能です。
  3. 本文書は、日経 Windows NT 1999 年 3 月号の「トラブル解決 Q&A コーナー」に掲載された「標準エラー出力をハンドルする - NTコマンドプロンプトの機能紹介」の草稿を筆者の方で HTML 化して掲載しているものです。

Copyright (C) 1998-2009 TAKAHASHI, Motonobu
Last update: 2006-07-12 00:00:19 JST
webmaster@monyo.com