S-JIS[2006-07-06/2011-09-23] 変更履歴

MS-DOS(コマンドプロンプト)の基礎知識

往年のMS-DOSやWindowsのコマンドプロンプト(DOSプロンプト)関連の基礎知識…だといいなぁ(爆)


コマンドプロンプトの起動方法

WindowsXPの場合

WindowsXPだと、コマンドプロンプトは拡張機能がデフォルトで有効になっている。よくhelpで「拡張機能」と書いてあるやつ。
cmdを実行するときのオプションを付けることによって、切り替えることが出来る。

>cmd /e:on	…拡張機能を有効にしてコマンドプロンプトを起動する
>cmd /e:off	…拡張機能を無効にしてコマンドプロンプトを起動する

Windows7の場合

Windows7のコマンドプロンプトの起動方法も、基本的にはWindowsXPと同様。[2011-09-23]

ただし、scコマンドの様に、“管理者として実行”しないと権限エラーになるコマンドがある(管理者権限のあるユーザーというだけでは駄目)。
そういったコマンドを実行する場合は、コマンドプロンプト自体を管理者として実行する必要がある。
上記の方法でコマンドプロンプトをクリックないしダブルクリックする代わりに右クリックでポップアップメニューを出し、「管理者として実行(A)」を選択すると、管理者として実行される。


コマンドの実行

コマンドは、コマンドプロンプトにコマンドを入力することで実行する。

コマンドには引数(パラメーター・オプション)を渡すことが出来る。[2006-07-07]
DOSでは基本的に「/」付きの英数字がオプションとしてよく使われる。「/」は区切り文字として認識されるので、コマンドの直後に書いても正しく認識される。

例)dir /w
例)dir/w


コマンドの先頭に「@」を付けると、そのコマンドは画面に表示されない。[2006-07-07]
ってコマンドプロンプトから直接入力している場合は常に表示されないから関係ない(苦笑)
バッチファイルから実行する場合にだけ意味がある。

@echo off

&」で区切ると、複数のコマンドを連続して実行できる。UNIXの「;に相当。
ただし、これで環境変数を扱う場合には要注意[2006-07-07]

例)dir zzz & dir foo		←dir zzzが成功しても失敗してもdir fooを実行する

( )」(丸括弧)でくくると、複数のコマンドを1つの固まりにして扱える。主にif文for文で使用。[2006-07-07]
これも、環境変数を扱う場合には要注意

例)(dir zzz & dir foo)
例)(
More? dir zzz
More? dir foo
More? )

||」で区切ると、先のコマンドが失敗した(0以外のコードを返した)場合だけ後続のコマンドを実行する。UNIXの「||に相当。
ただし、バッチの戻り値によって判断したい場合は要注意[2006-07-07]

例)dir zzz || echo fail	←dir zzzが失敗するとfailと表示する

&&」で区切ると、先のコマンドが成功した(0のコードを返した)場合だけ後続のコマンドを実行する。UNIXの「&&に相当。
(先のコマンドが失敗した場合にそこでコマンド実行を停止する)

例)dir zzz && del zzz	←dir zzzが成功したときだけdel zzzを実行する

&&」「||」には、論理演算の論理和・論理積のような優先順位はない。左から順番に処理される。

例)dir zzz || echo zzz-fail && dir foo || echo foo-fail

^」で終わった行は コマンドが次の行に続いていることを表す。UNIXの「\に相当。
大量のパラメータを書きたいときなんかに使える。

例)dir /b ^
More? Test.java
Test.java

なお、「^」で始まる文字は、その文字そのものを表す。UNIXの「\に相当。

例)echo ^%PATH^%
%PATH%

カレントディレクトリに在るコマンドの実行

UNIXではカレントディレクトリにパスを通しておかないとカレントディレクトリにあるコマンド(ファイル)を実行できないが、MS-DOSでは環境変数PATHとは無関係に カレントディレクトリにあるコマンド(ファイル)は実行することが出来る。

(PATHの中とカレントディレクトリに同一名称のコマンドが在った場合、カレントディレクトリにあるコマンドが実行される)

UNIXでは実行権限のあるファイルだけが実行可能だが、Windowsでは拡張子によって実行できるかどうかが決まる。[2008-04-01]
exeやbat等のあらかじめ決まっている拡張子の他、OSに登録されている拡張子のファイルが実行できる。
また、環境変数PATHEXTに登録されている拡張子の場合、拡張子を省略して実行することも出来る。

コマンドのヘルプ

MS-DOSで使えるコマンドのほとんどは、オプションとして「/?」(あるいは「-?」)を付けるとヘルプが表示される。コマンドによってはUNIXのように「--help」で出るものもあるが。
また、「help コマンド」を実行して説明が表示されるコマンドも少ないがある。でもほとんどは「/?」で出る説明と一緒。UNIXのmanに相当するが、manより相当貧弱

実行されるコマンドファイルがどこに在るかについては UNIXだとwhichといったコマンドで調べることが出来るが、MS-DOSにはそういうコマンドは無い(自分は知らない)
が、for文の拡張機能を使って以下のようにして調べられなくはない。

C:\>for /f %i in ("javac.exe") do @echo %i=%~f$PATH:i		…javac.exeの場所を探す
javac.exe=c:\j2sdk1.4.0_01\bin\javac.exe

これだといちいちコマンドラインから打つにはちょっと長いし、UNIXのwhichはもっと高機能なので、それに近づけたバッチファイル(whichもどき)を作ってみました。


リダイレクション(リダイレクト)

プログラムの実行結果を端末(コンソール)に表示する代わりに、ファイルに出力したりできる。

文字 説明
< コマンド < 入力ファイル名 コマンドへの標準入力にファイル(の内容)を使用する。
> コマンド > 出力ファイル名 コマンドの標準出力への出力内容を(コンソールでなく)ファイルに出力する。
>> コマンド >> 出力ファイル名 ファイルへ出力する際、ファイルが既存であれば そのファイルに追加する。
2> コマンド 2> 出力ファイル名 コマンドの標準エラーへの出力内容を(コンソールでなく)ファイルに出力する。
2>&1 コマンド > 出力ファイル名 2>&1 コマンドの標準出力および標準エラーへの出力内容を、同じファイルに出力する。[/2006-07-07]
| コマンドA | コマンドB コマンドAの標準出力への出力内容を、コマンドBの標準入力へ受け渡す。(パイプと呼ぶ)

ほとんどUNIXと一緒。


デバイス

一部の特別なファイル名はデバイスとして使われる。[2007-01-27/2007-04-05]

デバイス 説明 備考 更新日
nul 入出力に使用。
ここに出力したデータは、単純に捨てられる。
入力に使うと、何も入力されない(空っぽのファイルを読もうとするのと同じ)。
UNIXの/dev/null 2007-05-25
con コンソール。入出力の双方に使用可能 UNIXの/dev/pts/〜  
prn
lpt0〜9
プリンター。    
aux 補助入出力(RS-232C)    
com0〜9      

これらのデバイス名(大文字小文字は区別されない)はMS-DOS(Windows)が特別な扱いをするので、通常のファイル名には使えない。
WindowsXPで上記の名前のファイルを作ろうとすると、警告も説明も無しに名前の変更がキャンセルされる(苦笑)
拡張子を付けると(例えばcon.txtだと)エラーになって、その名前は付けられない。(con1やcom10はOK)

NULの例

C:\>dir > nul

表示した内容はどこにも出力されない。なんて無意味な例だ(爆) まぁでもファイルを指定して、戻り値で存在チェックは出来るかもしれない。

CONの例

C:\temp>copy con sample.txt
abc
def
^Z …さらにEnterが必要
         1 個のファイルをコピーしました。

conを入力とすることで、簡単なエディターの代わりとして使える。別の行の修正(間違いの訂正)は出来ないけど…。MSX-DOSなんかでは標準エディターが無いから、簡単なものならこういう方法で全部入力したもんだ。

C:\temp>copy sample.txt con
abc
def	  1 個のファイルをコピーしました。

conを出力にすると、結果がコンソールに出力される。上記の例だと微妙に画面表示が乱れてるので、素直にtypeを使う方がいいだろうけど…。


ワイルドカード

コマンドのパラメータとして、ファイル名の一部を表す「ワイルドカード」が使える。

* 任意の文字列(UNIXと同じ)。
? 任意の1文字(UNIXと同じ)

UNIXとの違いについては、UNIXのページを参照。

MS-DOSではワイルドカードの解釈は各コマンドが行うので、ワイルドカードに対応していないコマンドでは「*」や「?」は普通に文字として扱われる。

C:\temp>dir /b ?.bat	…ワイルドカードが使えるコマンドの例
a.bat
C:\temp>echo ?.bat	 	…ワイルドカードに対応していないコマンドの例
?.bat

ファイルの権限

Windowsでは、UNIXほどファイルやディレクトリの権限の種類は無い。(あるにはありそうだけど、分かりにくい)

権限 説明 備考 更新日
R 読み取り属性 この権限が付いていると、書き込みできない。 UNIXの読込権限に相当  
A アーカイブ属性 新規に作られたファイルや、ファイルが変更された場合にこの属性が付く。
xcopy等で、この属性が付いているものだけコピーしてフラグを解除する(つまり新しいファイルだけをコピーできる)、という使い方をする為にあるらしい。
現在では ほとんど使われていないらしい。 2007-05-08
S システムファイル属性      
H 隠しファイル属性 通常の方法では表示されない。 表示する方法  

attribコマンドで、各ファイルに付いている属性を表示したり変更したり出来る。
また、dir /aで特定の属性のファイルだけを表示する。

dir /qで、ファイルの所有者を表示する。


技術メモへ戻る
メールの送信先:ひしだま