リダイレクト文字の出力
何だ、そんなの簡単じゃーん。とか思ってやってみたら、意外に難題でしょ?
例えばこういう解がある。
@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のソースを作ってそれをコンパイルして実行。ってなことも当然できる から、侮れませんね(笑)
カレントディレクトリを保存する
ここでは、いったん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:\を使う。というロジックになってます。
#如何でしたでしょうか?ではまた(…次回は、あるのかなぁ……)