The DOS's Batch commands --- Last updates: at 2000.June.24


バッチのTips、その3です。


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

  1. 画面に"<>"と表示して下さい(「"」は出力しちゃだめ)
  2. 一時的に他のディレクトリに移動(cd)した後、元のディレクトリに戻る

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

リダイレクト文字の出力

何だ、そんなの簡単じゃーん。とか思ってやってみたら、意外に難題でしょ?
例えばこういう解がある。
	@Echo off
	If .%1.==.. Command /c %0 hoge
	@If %1==hoge Goto %1
	@Echo off
	Goto Ende

	:hoge
	@Echo on
	@Prompt $l$g
	@Goto Ende
	:Ende
そしてどっちかというと、サギとゆーか、インチキな解にこーゆーのもある。
	@Echo Off
	If .%1.==.. %0 $$$.deb $$$.com
	Echo a> %1
	Echo mov dx,108>>%1
	Echo mov ah,9>>%1
	Echo int 21>>%1
	Echo ret>>%1
	Echo:>>%1
	Echo e 108 3c 3e>>%1
	Echo a 10a>>%1
	Echo db "$">>%1
	Echo:>>%1
	Echo n %2>>%1
	Echo r cx>>%1
	Echo 00B>>%1
	Echo w>>%1
	Echo q>>%1
	Debug < %1 > nul
	%2
	Del %1 > nul
	Del %2 > nul
バッチでプログラムを作って、それを実行すれば要するに何でもあり。って訳。 バッチでCのソースを作ってそれをコンパイルして実行。ってなことも当然できる から、侮れませんね(笑)
Return


カレントディレクトリを保存する

 ここでは、いったんC:\に移動してから元のディレクトリに戻ってます。
 んで、どうして%COMSPEC%を使わないでいきなりcommand.comなぞを実行しているかと いうと、うちの%COMSPEC%はC:\bin\ndos.comだったりするんですが、それだとこのバッチが正常動作しないのです。

 ndosの場合、pushd/popdが使えるので、そもそもこんな小細工は必要ない。ということがあったりしますけどね(^^;;
#pushd C:\とやった後でpopdすると、元のディレクトリに戻るんです
#ちなみにndosは4dos (シェアウェア)のOEM版。Win9x対応の4dosも存在しているが、当方は未だに古い、古いDOS用のNorton Utilityに付属していたndosを使用中なのだ
	@Echo off
	If .%1.==.ReGo. Goto %1
	If .%1.==.MkBat. Goto %1

	Rem Check temporary directories
	%0 ReGo temp.bat %tmp% %temp% C:

	:ReGo
	REM Display current directory
	Cd

	REM Create return batch
	Rem %COMSPEC% /C %0 MkBat
	Command /C %0 MkBat> %3\%2
	@Echo off

	REM Change current directory
	Cd \
	REM Display Current directory
	Cd

	REM Return to old directory
	Call %3\%2
	REM Remove temporary batch
	Del %3\%2> nul

	REM Display again
	Cd
	Goto Ende

	:MkBat
	@Echo on
	@Prompt @Echo off$_$n:$_Cd "$p"
	@Goto Ende

	:Ende
 元のディレクトリに戻るためにはどうしてもテンポラリのバッチを生成する必要がありますが、それを作るフォルダを環境変数、tmp、tempの順に探し、どっちも無ければC:\を使う。というロジックになってます。
また、Del %3\%2> nulとわざわざリダイレクトしているのはndos対策です。command.comはdelコマンドでファイル名がワイルドカードなしに指定された場合、黙って消しますから「> nul」は不要です。
とはいえ、"My Documents"のようなフォルダにも戻れるように:
@Prompt @Echo off$_$n:$_Cd "$p"
と、「"」で「$p」を囲ってますが、こういう書式が使えるのはWin9xのCommand.comであり、古いndos.comではNGですね。う〜む中途半端かな。でもまぁ上のままでCommand.comで問題なく動作はします。ndos.comとかその類似品を使用している場合は各自工夫。とゆーことで、よろしく。
 この例のミソは、Command/C。子プロセス内で変更した環境変数は親プロセスには反映されない。ということ。そしてPromptコマンドの有効利用。です。
#ドライブレターが割り当てられていない場所がカレントディレクトリだった場合、戻れない気がするが、気付かなかったことにしよう(^^;;

Return


#如何でしたでしょうか?ではまた(…次回は、あるのかなぁ……)


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