やっぱりコマンドラインが最高です
Windowsの[スタート]メニューの中に眠っている「コマンドプロンプト」。皆さんは使ったことがありますか?立ち上げてみると,出てくるのはいかにもコンピュータコンピュータした愛想のない画面です(図1)。「ああ,何かキーボードで打ち込んで操作する上級者向けの機能だな。自分には関係ない」と考えて,今日まで使わずに来た人も多いでしょう。
コマンドプロンプトのように,キーボードから打ち込んだ文字列でコンピュータに指示を出す「コマンド環境」は,Windowsのデスクトップ環境のような「GUI(Graphical User Interface)」に比べると,とっつきにくいものです*1。しかし,コマンド環境にはコマンド環境ならではの良さがあります。コマンド環境のほうがずっと手早くできる場面がたくさんあるのです(図2)。
意外に簡単! 使って便利! コマンド環境“超”入門 - プロローグ コマンド操作のすすめ:ITpro
プログラミングには主にvimを使っているので、ファイル操作などはコマンドプロンプトを使います。エクスプローラはあまり使いません。マイコン時代からPCを扱ってるので、CUIが馴染んでしまってるせいでしょうか。
Windows95時代のDOSプロンプトなどと比較すると、最近のWindowsに添付されているコマンドプロンプトはだいぶ使いやすくなってます。UNIXのシェルなどに比べると一部エレガントじゃない実装がありますが、慣れれば気にならないです。上記記事と重複する部分が多いかと思いますが、ふだんyasuhoが便利と思う使い方を書いてみますね。
なお、以下の機能はWindows Vistaで使っているものですので、XPや他のOSでは違う部分もあるかもしれません。
操作編
操作一般
Homeキーで行の先頭、Endキーで行の最後、Ctrl+左右カーソルキーで空白で区切られたワード単位の移動が可能。カーソルキー上下で過去のコマンド履歴を参照できる。文字+F8で指定文字から始まるコマンドを検索。
タブによるパス名補完
タブキーを押すたびに、カレントディレクトリのファイル名が補完される。文字を入力してからタブを押せば、その文字から始まるファイル名を列挙。*.txtなどのワイルドカードもOK. ファイル名にスペースが含まれる場合はダブルクォートを補完してくれる。CDなどディレクトリを扱うコマンドの後ろではディレクトリだけ出てくるといった機能もあり。
ファイルの関連づけ
ファイル名だけ入力すると関連づけされたアプリを使ってファイルを開く。実行ファイルならそのまま実行。関連づけがないファイルでも、notepad foo.txt.back などのようにして開くことも可能。
マクロ
doskeyを使ってマクロが定義できる。doskey np=notepad $* とすれば、np foo.txtでメモ帳が起動。/macrofile=filename とすることで、マクロ定義をファイルから読み込むことも可能。
各種設定
システムメニューのプロパティを開くことで、各種設定が出来る。初期設定では画面バッファサイズは300行と少ないため、9999など大きめの設定にすると便利。コードページを英語(437)にすると漢字が読めなくなるが、英数字の表示が太めになるので、プログラミングには見やすいと思う。
ヘルプ
たいていのコマンドは/?で説明が表示される。HELPと入力するとコマンド一覧。ほとんどのコマンドはオプション指定で "/" の代わりに "-" が使用可能。
バッチコマンド編
一般
同一行に複数のコマンドを書く場合は & で区切る。| など特別な記号を扱いたい場合は、^| と書くことで文字として扱うことが出来る。
グルーピングをしたい時は () でくくる。例:
for %I in (*) do ( call :dosomething if %errorlevel% goto error )
ラベル
gotoの飛び先として使われることの多いラベル。call :ラベル名とすれば、サブルーチンのように使える。パラメータはバッチ同様%1,%2などで参照できる。復帰はgoto :eofで。:eofはバッチファイルの最後を表す特別なラベルで、バッチ処理そのものを終了させることが可能。
FOR
yasuhoがよく使う機能を紹介。forは様々な機能があるが、これを使いこなすことがバッチファイルを使いこなすことと考えて差し支えない。
for /f %I in ('cmd') do ...
cmdを実行して出力された結果をforで順次実行。
for %I in (*) do call :dosomething %~nxI
%~を使うと、変数をパス名と見なし、様々な加工ができる。上記例ではnがファイル名でxが拡張子を表す。%IがC:\temp\foo.txtなら%~nxIはfoo.txtになる。for以外でも使える場合がある。
for /f %I in (foo.txt) do call :dosomething %I
foo.txtから1行ずつ読み込んで実行。
for /f "tokens=1,2,3" %I in (foo.txt) do call :dosomething %I %J %K
上記と同じだが、行を分解して変数に格納。例えば上記例で "abc 123 xyz" という行がfoo.txtにあった場合、%Iはabc, %Jは123, %Kはxyzになる。
コマンド編
PUSHD / POPD
PUSHD ディレクトリ名とすることで、現在のディレクトリをスタックし、指定パスへ移る。POPD で元のディレクトリへ戻る。環境変数PROMPTに$+を追加することで、スタックレベルが + で表示されるようになる。
ROBOCOPY
いわゆるコピーコマンドだが、このコマンドの真価は /mir オプションにある。このオプションを使うとファイルのミラーリングが手軽に行えるので、yasuhoは高速なバックアップツールとして愛用している。
SUBST
パスを指定ドライブに割り当てる。例えば subst F: C:\temp\foo とすると、C:\temp\foo へ F: でアクセスできるようになる。うまく利用するとファイルの比較や各種操作が簡略化できる。