ホーム  ざれごと  ワシントン州  ツール  NT豆知識  Win32プログラミングノート  私的用語  ジョーク  いろいろ  ゲーム雑記  Favorites  掲示板   Mail

Windows NTのコンソール

Last modified: Sat Apr 05 04:42:08 2003 PDT

一つ上へ

はじめに

NTのコマンドプロンプトをちょっと便利にするテクニックをご紹介しましょう。

…と、その前に。コマンドプロンプトを頻繁に使うのなら、まずここをチェックしてください。間違って大事なファイルを失ってしまう前に。

さて気を取り直して。

NTでは、UNIXのkshなどに比べてコマンドプロンプトがお馬鹿さんなので困りもの。 CygnusのGNUポートの中にあるbashが便利そうなんだけど、 たまにお亡くなりになることがあってちょっと不幸。 というわけで、cmd.exeとコマンドプロンプトのちょっと便利な使い方をまとめてみます。

基本

コントロールパネルでの設定

コマンドプロンプトのプロパティは、コントロールパネルの「コンソール」アプレットから設定します。 個々のコマンドプロンプトからシステムメニュー→プロパティでもいいんだけど、コントロールパネルから設定すると、全ての コマンドプロンプトで設定が有効になります。

まずぜひとも設定したいのが、「簡易編集モード」と「挿入モード」。



「簡易編集モード」にしておくと、マウスの左ボタンで領域選択、右ボタンでクリップボードへコピー、という技が使えるようになります。 選択していない状態で右ボタンをクリックすると、クリップボードの内容をコマンドラインに挿入します。
「挿入モード」は、デフォルトでコマンドライン編集を挿入モードにします。

余談ですが、NT5.0からは、ダブルクリックで空白に挟まれた単語を選択することが出来るようになります。

次に、仮想スクリーンバッファを大きくしておきましょう。

こうしておけば、ずりずりとスクロールアップされた過去の出力を、スクロールバーをぐりぐりして参照することが出来ます。 単なるcatやtypeでless代わりにもなります。 残念なことに、16ビットなコマンドを起動するとバッファがクリアされてしまうようですが。

インテリマウスの効用

余談ですが、「インテリマウス」という、ローラー付きのマウスを使うと、コマンドプロンプトでローラーを回してバックスクロールが出来るようになります。

GUIコマンドの起動

start /wで起動すると、終了を待ちます

それから、(これは皆さんよくご存知だと思いますけど念のため)コマンドラインから直接、GUIなアプリケーションを起動できます。 以前はstartコマンドを使わなければできませんでしたが、今は直接起動が可能です。
また、

C:> hogehoge.html

と、コマンドではないファイルを、拡張子まで指定してやると、拡張子に「関連付け」されたコマンドを起動し、指定したファイル名を引数として渡してくれます。
このあたりは、95と仕様を合わせたのかな?

コマンドラインから直接GUIアプリケーションを起動すると、割とすぐに制御がコマンドラインに戻ってきますが、バッチファイルから起動するとそのアプリの終了を待ってしまいます。これは仕様でしょう。で、 GUIアプ リの終了を待たずにバッチ処理を先へ進めたい場合は、startコマンドを明示的に指定すればOKです。

なお、startコマンドには予想を上回るいろいろなオプションがあります。一度 start /?でヘルプを見てみると面白いでしょう。

3文字を越える拡張子

デフォルトの状態では、3文字を越える拡張子がcmd.exeで正しく扱われません。 例えば、

C:> del *.htm

によって、*.htm だけではなく *.html まで削除されてしまいます。 この問題は、NTFSでも発生します。 かく言う私も、やられてしまいました。
DOSとの互換性だかなんだか知りませんが、まったく余計なお世話です。

これを防ぐために、以下のレジストリを0に設定しなければなりません。

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem

Win95TruncatedExtensions : REG_DWORD

デフォルトの値は1です。これを、0に変更します。変更した後は、念のためリブートしてください。

ただし、*.htm と *.html の区別がなされるのは、このレジストリを変更した後に作成・変更されたファイルに限られます。レジストリ変更前に作成されたファイルに関しては、依然 *.htm と *. html の区別がなされません。重々注意をお願いします。

Windows 2000用: ntfs-no-trunc.reg

なお、レジストリの変更は、くれぐれも個人の責任において行ってください。

<補足> 実際にDELコマンドを発行する前に、DIRコマンドでどのファイルがワイルドカードにマッチングするか確かめておくのが、お・と・な、というものです(笑)。

ファイルの関連付け

ファイルの拡張子とアプリケーションの関連付けはExplorerでも出来ますが、コマンドラインからも参照・変更することができます。

例えば、次のコマンドを叩いてみてください。

C:> assoc .html

次のように表示されることでしょう。

.html=NetscapeMarkup

これは、"*.html"というファイルが"NetscapeMarkup"というファイルタイプに関連付けされていることを示します。

そいでは、今度は"NetscapeMarkup"というファイルタイプにどのアプリケーションが関連付けられているか、調べてみましょう。

C:> ftype NetscapeMarkup
NetscapeMarkup=E:\netscape\Program\netscape.exe "%1"

ということで、無事 "*.html" が Netscape Navigatorに関連付けられていることが分かりました。

コマンドプロンプトから、これらを変更する場合にも、assoc コマンドと ftype コマンドを使います。

assoc .html=htmlfile

で、"*.html" が Internet Explorer に関連付けられます(と思います、IEがインストールされていれば)。

関連付けを消したいときには、

assoc .html=

でOKです。

拡張子とファイルタイプの関連付けは、

assoc

と引数を付けずに assoc を起動すると一覧表示されます。ファイルタイプの方も同様です。

拡張子の省略

また、PATHEXT という環境変数を設定しておくことで、.com、.exe、.cmd、.batの他にも実行形式の拡張子を指定することが出来ます。

set PATHEXT=.pl;%PATHEXT%

これで、perlのスクリプトをバッチファイル代わりに使うことが出来ます。

あ、assoc と ftype の登録も忘れずにね。ftype /?のヘルプを見てください。

環境変数の設定

環境変数は、コントロールパネル→システム→環境で設定しておくと、全てのプロセスについて設定できるので、ちょっと幸せです。

特殊キー

NT4.0のコマンドプロンプトで使える、主な特殊キーを表にしてみました。

キーアサイン用途
カーソルキー 左右のカーソルキーで、行内編集。上下のカーソルキーで、ヒストリの呼び出し。
F3 直前の入力を呼び出し
F7 ヒストリ一覧のポップアップ
F8 途中までタイプしてF8を押すと、入力にマッチするヒストリを呼び出し。続けてF8を押すと、 マッチする行を次々に表示
Ctrl+
左右のカーソル
空白で区切られた引数単位の移動
ESC 行抹消
HOME カーソルを行の左端へ移動。
Ctrl+HOMEでは、カーソルより左の文字列消去
END カーソルを行の右端へ移動。
Ctrl+ENDでは、カーソルより右側の文字列消去

特殊キー関係では、まぁ便利なのはこのあたりでしょう。他のファンクションキーにも機能が割り当てられているけど、 あまり役立ちそうにありません。:-P
あ、これらのキーは、cookedモードのときならcmd.exeでなくても使えます。コンソールの機能なんでしょう。

これらのキーが、Ctrl+アルファベットなキーにリアサインできれば、cmd.exeにも我慢できるようになると思うんですけど…。

ディレクトリ
移動

さて、ヒストリは良いとして、まだディレクトリの移動が面倒です。 UNIXのシェルなら、環境変数CDPATHが使えるしワイルドカードも使えるんですが。 しかも、NTではカレントディレクトリはプロセス毎に持っているため、DOS時代のように拡張CDコマンドを作って対処するわけにもいきません。
実は、NTのcmd.exeではCDPATHは使えませんが、ワイルドカードは条件付きで使えます。 これって、特に何も設定する必要はなく、例えば

cd /d e:\use*\hiro*\ww*

なんて入力すれば、e:\users\hirofumi\wwwに飛んでいってくれます。/dは、ドライブの移動も行うスイッチです。

どうせなら、パスの区切りが"/"でも受け付けてくれるといいのに。

でもUNIXのシェルに比べてちょっとお馬鹿さんで、与えられたパスを分解して、そのレベルでマッチしたディレクトリを見に行くため、 複数の候補が途中にある場合に迷子になって泣き言を言ってくるようです。 もうちょっと賢くなってくれ>cmd.exe

pushd, popd

そいで、pushdpopdも実はcmd.exeに追加されています。 でも、

dirsコマンドがないのはなぜなんだ〜

その後の調査で、引数を付けない"pushd"がdirsに相当するということが判明しました。 逆にいうと、カレントディレクトリをプッシュしたいときは、"pushd ." と "." を引数に付ける必要がある、ということですね。

その他、コマンド拡張機能とかいうオプションがcmd.exeに追加されていて(/x)、 昔ながらの組み込みコマンドが若干機能拡張されるようです。 詳しくは、cmd /?で調べてみてください。デフォルトの状態では、拡張機能が有効になっています。

UNCに対するpushd, popd

また、pushd, popdをつかうと、ネットワークの先にあるリモートのシェア(公開しているディレクトリ)をアクセスするのが便利になります。 例えば、fooというマシンのbarというシェアにアクセスするには、UNCの形式でパスを記述する必要があります。
C:> type \\foo\bar\file.ext
頻繁に\\foo\barにアクセスするときには、いちいちUNCを記述するのも面倒なので、ドライブにマップしたりします。
C:> net use * \\foo\bar
でも、一時的に\\foo\barにアクセスするときは、pushdを使うのが最も便利です。
C:> pushd \\foo\bar
これで、あいているドライブレターに自動的に\\foo\barがマップされます。作業が終わったら、popdすればマウントが解除され、以前のディレクトリへ戻ります。
c:> popd

バッチコマンド

バッチコマンドは、それはそれはめちゃめちゃに拡張されています。代表的な例は、forコマンドやらifコマンドです。

そのうち書くので待っててね。
# if 文についてはちょっと下に書きました

待ちきれない人は、

for /?
if /?

などとと叩いてみましょう。特にforコマンドではとんでもなく長いヘルプが表示されますから、スクリーンバッファは多めにしておきましょう(笑)。

ま、それでもUNIXのshellと周辺コマンドの充実ぶりとセンスのよさには足元も及びませんけどね。:-P

出発点(MS-DOSのcommand.comとOS/2のcmd)が悪すぎたんですなぁ。合掌。

リダイレクト…

標準出力のリダイレクトは ">file" ですが、標準エラー出力のリダイレクトは "2>file" でおっけーです。
標準出力と標準エラー出力を同じにするには、"command >file 2>&1"。ちょっとshの書式の真似ッコ。

&& と ||

UNIXシェルの真似ッコといえば、コマンドラインでもバッチファイルでも有効なんですが、"&&" ってのがあります。 コマンド行でセパレータとして使えますが(要するにマルチステートメント)、コマンドの実行結果が真であったときに以下を実行ということになってます。

 copy aa.txt bb.txt >nul && echo succeeded.
 

AND じゃなくて、OR には、 "||" が使えます。perl に慣れていれば、直感的に理解できるでしょ?

 copy cc.txt dd.txt > nul || echo failed.
 

if

if 文に else 節を付けることができ、さらに複数行に渡る if 文が記述できます。

 if "%fname%" equ "" (
     echo file name is empty
 ) else (
     echo file name is %fname%
     pause OK to delete?
 )
 

比較には、以下の書式が追加されています。

 IF [/I] string1 compare-op string2 command
 IF CMDEXTVERSION number command
 IF DEFINED variable command
 

/I を付けると、大文字・小文字を区別しない比較になります。どの書式でも、上記の複数行の if 文が書けます。
DEFINED は、環境変数が定義されていれば true になります。

コードページ

英語版のツールを使うとき、コンソールも英語環境になると嬉しいですね。 日本語のままでは、罫線が化けたりすることがあります。

NT 4.0Jのコンソールウィンドウでは、日本語と英語の環境を切り替えて使うことができます。 切り替えに使うコマンドは、chcpです。 英語モードにするには、
C:> chcp 437
とタイプします。日本語モードに戻すには、
C:> chcp 932
でOKです。

デスクトップなどにショートカットを作っておけば、ショートカットのプロパティで起動時のコードページを選択できます。

コードページ設定ダイアログのタブ

コードページ設定ダイアログ(の一部)

Note: 日本語のコードページは932、USのコードページは437です。 正確には、日本語WindowsのOEMCPとACP(ANSI CodePage)はともに932、英語版WindowsのACPは1252でOEMCPが437です。
もうちょっと専門的な話をしておくと、英語でラスタフォントを選択したときには、コードページ437を使って内部UNICODEをANSI文字列へ変換してからGDIを呼びます。そのため、CP=437の時は、ギリシャ文字など表示で きないものがあります。
"Lucida Console"や""MS ゴシック"などはTrue TypeなUNICODEフォントなのでコード変換は不要で、結構いろんな文字が表示できます。
なお、OEMCPってのは、古き良き(?)DOSのファイル名と関わりがあります。

ファイル名のドラッグ&ドロップ

エクスプローラからコンソールウィンドウへファイルをドラッグ&ドロップすると、そのファイルのフルパス名がコマンドラインへ挿入されます。

あんまり知られていないような気がするので、念のため。

ファイル名補完

さて、最後にファイル名コンプリージョン。これもUNIXのシェルと違って結構融通が効きませんが、まぁないよりはましでしょう。 で、次のレジストリを設定する必要があります。

HKEY_CURRENT_USER\Software\Microsoft\Command Processor\CompletionChar

これに、DWORDでキーコードを与えます。例えば、タブキー(Ctrl+I)なら、0x09です。 Ctrl+Oなら、0x0fです。

あとは、引数を一つずつ消していってくれるキーがあれば便利なのになぁ

Disclaimer

あ、もしかして誤解されるとナニなんで念のため。 ここで取り上げた機能の大部分は、NT 4.0からサポートされた機能かもしれません。 NT3.51でどうなっているかは未確認です。

Since 1996

一つ上へ

ホーム  ざれごと  ワシントン州  ツール  NT豆知識  Win32プログラミングノート  私的用語  ジョーク  いろいろ  ゲーム雑記  Favorites  掲示板   Mail