The DOS's Batch commands --- Last updates: at 1998.Oct.29


さて今回は、Windows 95/98上でないと意味がないバッチの技を含んでおります。
…って前回もそんなんがあったやろが!と突っ込まないで(T_T)

一応、前回に合わせて設問形式にします。それでは次、行ってみましょうか。

次の問題を解決するにはどうすればよいか?

  1. ERRORLEVELを画面に表示する
  2. 日付をコマンドの引数として渡して下さい
  3. 今日の日付でフォルダを作って、そこにCDしましょう
  4. 文末のCtrl-Zを削って下さい
  5. ロングファイル名の一覧を表示する(dirの使用は不可)

Short cuts: [Prev][Up][Next] [Return to Top]

ERRORLEVELを画面に表示する

	command/z
 おいこら、ちょっと待て!という声が……。だけど便利なんすよ。これ

Return


日付をコマンドの引数として渡して下さい

	@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を起動すれば、その子プロセス内で環境変数をどういじくろうが親のプロセスには影響しない、という特徴を利用しています。

Return


今日の日付でフォルダを作って、そこに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とか、何やらおいしそうなのがあるでしょう?そう。そいつを使えば万事解決!なのですよ。

Return


文末のCtrl-Zを削って下さい

	@Echo off
	If .%2.==.. %0 %1 tmp.tmp
	If %1==%2 Goto Ende
	If not exist %1 Goto Ende
	If exist %2 Goto Ende
	Type %1 > %2
	Del %1
	Ren %2 %1
	:Ende
 …たまにあるでしょう?ホームページの一番最後に小さな矢印だのポチだのがある奴。あれは多分、Ctrl-Zだと思うのです。って、うちのサイトにも一杯あったりするが、今更なので放置(ぉぃぉぃ)。まぁそういうのを消そうと思うなら、
C:\MYDOCU~1\HOMEPA~1\BAT> debug HOGEHOGE.HTM
-r
AX=0000  BX=0000  CX=1424  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=1660  ES=1660  SS=1660  CS=1660  IP=0100   NV UP EI PL NZ NA PO NC
1660:0100 61            DB      61
-r cx
CX 1424
:1423
-w
Writing 01423 bytes
-q
C:\MYDOCU~1\HOMEPA~1\BAT>
というDOS/Windows 95,98に標準添付なコマンドだけで行う手があるのだが、こういう方法をそもそも思い付くという時点で、変態!古代種族!化石オタク!!と(しくしく……)言われかねないので、こんなバッチを復元してみました。

いやその。元々Ctrl-Zがテキストファイルの終わり(EOF)だ、というのはCP/M-80の仕様であって、DOSもその仕様を引き継いで今日まであるのだが、生憎unixではCtrl-DがEOFだったという事実があり、それで昔このようなバッチを作ってtelnetしてたんですが、必要がなくなって以来忘れていたのです。で、今回再度作ってみたという次第。だから復元、なのですわ

Return


ロングファイル名の一覧を表示する(dirの使用は不可)

	@Echo off
	Echo:--- LFN ON ---
	LfnFor on
	For %%f in ("\My Documents\*.*") Do Echo %%f
	Echo:--- LFN OFF ---
	LfnFor off
	For %%f in ("\My Documents\*.*") Do Echo %%f
	Echo:--- LFN OFF (2) ---
	For %%f in (\MyDocu~1\*.*) Do Echo %%f
 ええと、カレントディレクトリ内のLFNの一覧とか、「"」を付けたら/取ったらどうなるの?、とか色々やってみて下さい。暫くの間、遊べますぞ(^^;;
 なかなか興味深い挙動をするでしょう?

 注意:レジストリを操作して、LFNに対応するSFN (Short file name、要するに8.3な従来DOS互換の名前)の生成規則を変更している人はちゃんとサンプルバッチの内容を変更してから実行して下さいね

Return


#…ということで今回はここまで。次は、うぅ。いつになるんだか分かりません(^^;;


Short cuts: [Prev][Up][Next] [Return to Top]
なお、この文章のURLは http://www.vector.co.jp/authors/VA006065/scripts/batch2.htm です。多分(^^;;