プログラマyasuhoの隠れ家

某ソフトウェア企業に勤務するおじさんプログラマyasuhoです

cmd.exeノススメ


コマンドプロンプトなんて使ったことない、という人には意味のない情報です)


ぼくはもともとUNIXをメインに使っていた人なので、Windowsがメインになった今でも、コマンドプロンプト(嫁さん曰く「黒い画面」)を愛用している。
ファイル操作をするのにエクスプローラを使うのはどうもかったるい。(便利な時もあるのだが)
そもそもマウスを使うのが面倒な人なので、キーボードで操作するコマンドプロンプトは使っていて安心なのだ。
アプリケーションを起動する時でさえ、notepad foo.txtなどとコマンドウィンドウから入力しているぐらいだ。


start foo.docとかすれば、ワードだって起動できるから不便はない(間違ってる?)
ウィンドウズを使っている時は必ず一つ以上のコマンドプロンプトが立ち上がっている。
もちろんプログラムを書く時は、VisualStudioであってもコマンドプロンプトだ(これも間違ってる?)


そんなわけで、日々のちょっとした定型処理なんかはバッチファイルを使うわけだが、UNIXから来たばかりの時は、このバッチの機能の低さに唖然としてしまった覚えがある。
Linuxなどを知っている人は分かると思うが、UNIXシェルスクリプトは非常に強力であり、たいていのことはこれでできてしまう。
対してバッチファイルは大変貧弱であり、ちょっとした処理をするためにもawkperlといった外部ツールに頼らざるを得なくなってしまう。
しかもこれらのツールは標準で入っていないので、他のPCなどでバッチファイルが動かなくなってしまったりして、おもしろくない。


日々バッチファイルの貧弱さに嘆いているあなた(あまりそういう人はいないか)
Windows 2000以降のOSでは、コマンドプロンプトが大幅に強化され、かなりのことができるようになった。
UNIXシェルスクリプトまでとはいかないが、けっこういろいろなことができるのだ。


たとえばERRORLEVELや文字列の一致チェックぐらいしかできなかったIF文。
大小の比較なんかもできるようになった。

if %i% gt 100 goto end		--> iが100以上ならendへ

SET文も算術式が使用できる。

set /a a=a+1		--> aに1を加える

CALL文は他のバッチファイルを呼び出すだけでなく、同一バッチファイル内のサブルーチンコールのように使える。

call :func %p1%		--> p1をパラメータにしてfuncをコール

[...]

:func
echo %1		--> パラメータは%1,%2,..に入る
goto :eof		--> EOFに達すると呼び出し元へ復帰

この他にもいろいろな拡張があるが、もっとも使えるのはFOR文である。
FOR /?で現れるヘルプを見ると分かるが、実にいろいろなことができる。
たとえばコマンドの出力を与えてFORに処理させるとか、いくつかのフィールドに区切られたテキストファイルを読み込んで、それぞれのフィールドに対して何か処理をしたりとか、応用次第で様々な処理が可能だ。

# foo.txtを1行ずつ読み込んで、最初の二番目のトークンに対して何かする
for /f "tokens=1,2" %i in (foo.txt) do call :dosomething %i %j
#  カレントディレクトリ配下のファイル名を全て表示
for /f %I in ('dir/s/b') do echo %~nxI

for /?などというように入力すれば簡単な説明が出てくるので、興味のある方は研究してみると面白いかもしれない。
ただ、従来のバッチファイルの構文をむりやり拡張しているので、文法は全然エレガントじゃないし、できそうでできないこともあるので、なかなかクセがあるのだが、従来のバッチより格段に使えることがお分かりいただけると思う。
定型処理なんだけど、プログラムを書くほどじゃない、という場合はおすすめだ。


あと、コマンドプロンプトは長いファイル名を入力するのが面倒だという方。
ファイル名を入力する場所でTABキーを押してみよう。
ファイル名が補完されたでしょ。
ファイルが多い場合は先頭の数文字を入力してからTABを押せば補完完了。
長いパス名や漢字まじりのファイル名を打つ時に役立つこと間違いなし!


以上コマンドプロンプトノススメでした。:)
すでにご存じでしたら、ごめんなさい。