[第25回]
「今日の日付でフォルダを作って、そこにCDしましょう」
Windowsユーザーに捧ぐ
仕事上の必要から、今日の日付のフォルダを自動で作るバッチファイルを考えなければいけないようになりました。バッチと言うからには、Windowsでのお話です。
Windowsでバッチというのはおかしいとお考えですか? WindowsはすばらしいGUI環境を提供し、すべての操作がマウスで行える。バッチの自動処理をWindowsに期待するのは本来おかしいって。私の考えでは、自動処理を期待するのがおかしいのではなくって、自動処理を期待するのを拒否するWindowsのGUI思想がおかしいのです。一応所謂DOS窓は用意されていますが、そんなものを使っていると、「何? それ。その真っ黒なの。」なんてことになってしまいます。Microsoftの思想は、ユーザーに対して、コンピュータをブラックボックスのまま封印しておきたいのです。DOS窓は、Microsoftにわずかに残されている良心の表れであって、ブラックボックスであってはならないコンピュータの内部への、唯一残された入り口なのです。
まあそういうことはさて措き、「今日の日付フォルダ」自動作成バッチです。これがかなりの難物です。昔馴染んだMS-DOSのコマンド集とかを引っ張り出してきて格闘してみましたが、どうしてもうまくかない。dateコマンドから今日の日付を取り出すことはできるのですが、それをmdに引数として渡すことなんてことはできっこない。でもって、自力開発はあきらめてネットに当たってみることにしました。
そしたらあるんですよね、ちゃあーんと。それをさっそく以下に載せます。
http://hp.vector.co.jp/authors/VA006065/scripts/batch2.htm
@Echo off
Echo @Echo on> tmp.bat
Echo Prompt myprog "$D">> tmp.bat
Echo @Echo:>> tmp.bat
Command/C tmp | Find/V "Prompt" | Find "myprog" > tmp2.bat
Del tmp.bat
tmp2
これを切り取って実行すると、myprogというプログラムはないよって言われます。
でもって、コントロールパネルの「地域」のプロパティを変更すると$Dで出てくる日付の表示形式も違ってきます。その意味ではToy programでしかないかもしれません。が、バッチ単独ではどうしたって分かりようがないことをPromptコマンドで知り得る、というノウハウは重要です。
ここでは何故Callではなく、Command/Cなのか、という点が重要ポイントです。Command.COMを起動すれば、その子プロセス内で環境変数をどういじくろうが親のプロセスには影響しない、という特徴を利用しています。
今日の日付でフォルダを作って、そこにCDしましょう
@Echo off
Echo Prompt md "$d"> tmp.bat
Echo:>> tmp.bat
Echo Prompt cd "$d">> tmp.bat
Echo @Echo off> tmp2.bat
Command/c tmp.bat |find /v "Prompt">> tmp2.bat
Del tmp.bat
Call tmp2
Del ..\tmp2.bat
先の問題の応用です。LFN (Long file name)が使えるOSならではの技です。
これができるとあらば、「今日の日付のファイル」を作り、そこに何かをリダイレクトする、というバッチも問題なく作れるはずです。
Prompt /?
とすれば、ほら。$Gとか$Bとか、何やらおいしそうなのがあるでしょう?そう。そいつを使えば万事解決!なのですよ。
どうですか? わかりますか? わたしは、正直なところ全くわかりません。しかし、実行してみると、このバッチが置かれているディレクトリーの下に日付ディレクトリーを作り、その日付ディレクトリーに下りてしまいます。すばらしいとしか言いようがありません。
これを使えば、今日作ったファイルを今日のフォルダに自動で整理することが簡単にできてしまいます。今日の日付ファイルに必要な内容を放り込むことだって、自動でできます。この「自動」というのがバッチの真骨頂であって、GUIにはこれができないんですよね。マウスでクリックだ、ダブルクリックだ、窓を2つあけでドラッグだ、なんてことになるのです。
もともとGUIは自動処理を苦手にしています。Windowsユーザーだからと言って、GUIだけに染まるんじゃなくって、時にはDOS窓を開いてみましょう。UNIXの世界ではこれは常識であって、X Window というGUIを使う時にはDOS窓のようTerminal Window を必ず開いて作業します。全ての作業はこのTerminal Window の中でできてしまうので、初めっからX Window というGUIを開かないことも多いです。言ってみれば、MS-DOS の世界ですね。味も素っ気もありませんが、UNIXのバッチ処理は、MS-DOSには比べものにならない強力なスクリプトを生成します。一見プログラムと思っていたのが、中をのぞいてみたら、バッチだった、いうのばかりです。
ついでに言っておきますが、Windows には意味不明のレジストリーなんていうのが、OS の設定を担当しています。レジストリーエディターなんてのを使い、レジストリーをゴリゴリとさわれば OS が変わりますが、どうもレジストリーは意味不明です。それは、レジストリーが肝心なところで秘密にされているからです。UNIXに意味不明のレジストリーなんてものはありません。UNIXの設定は全てはテキストファイルですから、全てがオープンで分かりやすく、エディターを使って自由に編集できます。あなたは、レジストリーとテキストファイルの、どちらを好みますか。
2002.8.25
[戻る]