/com2txt

com2txt tool (from 1993)

Primary LanguageC

 			com2txt V1.11 document

				新出尚之(nide@ics.nara-wu.ac.jp)  94.09.15

§1. com2txtとは

  com2txtとは、comファイルを「com形式のまま」テキストファイルに変換するツ
ールです。uuencodeなどと異なるのは、com2txtでテキスト化した後のファイルも
ちゃんとcomファイルとして動作する点です。従って、インターネットなどのネッ
トワークでメールにて直接送れる(相手側ではdecodingを必要とせずにそのまま動
作する)comファイルができあがるわけです。
  しかも、com2txtでテキスト化した後のファイルは、(8章で述べるcom-batch共
用形式での出力を除き)command.comでecho可能な文字だけからなっており、バッ
チファイル内などでechoを使って容易に生成することができます。このことの利
点としては、DOS汎用性を全く損なわずに多機能なバッチファイルを作れるなどが
考えられます。これについて詳しくは7章で述べます。(あまり意味はないですが、
UNIXのshやcshにとっての特殊文字、例えば「$」とか「*」など、も排除してあり、
UNIXでも普通にechoできるようになっています。)

  com2txtはフリーソフトです。使用・複写・再配布は自由ですが、改変したもの
を他人に渡す場合、改変者・改変箇所が明確になるようにして下さい。(但し、
getopt.cだけはパブリックドメインのものを使用しましたので、利用に関して何
らの制限もありません。また、sampleディレクトリの下もパブリックドメインと
します。) それから、不具合の報告などは上記メールアドレスへご連絡下さい。
なお、このプログラムの使用によって被った損害があっても作者は責任を負いま
せん。
  むろん、com2txtを使ってテキスト化したファイルについては、その著作権は、
元のファイルの著作者に帰属します。com2txtを使ったことによって、その配布な
どに関して、com2txtの作者への連絡義務などが生ずることはありません。

  com2txtと良く似た働きのツールとして、Alexander Prussのcomtというツール
がやはりフリーソフトで存在します。両者の最大の違いは、com2txtでは、上述し
たように変換後のファイルがechoで生成できるなど、バッチとの組み合わせで使
うための配慮が行われているのに対し、comtにはそれがない点です。例えば、
comtの生成するテキストcomファイルは、「<」などの文字を含むためechoで生成
することはできません(特定バージョンのDOSでは工夫によってはできるかも知れ
ませんが、DOSのバージョンなどが異なっていても通用する汎用的な方法はありま
せん)。従って、7章で述べるような応用はcomtでは不可能です。

  なお、当面このソフトの最新版は、anonymous ftp shannon.e.ics.nara-wu.ac.jp
(160.11.66.11)のpub/dosutilにて配布します。ご利用下さいませ。


§2. 内容物

  本パッケージには、以下のファイルが含まれています。

	readme.doc		このファイル
	readme.eng		英語版ドキュメント(英語に自信なし^_^; かなり
				古い版のまま更新していない)
	com2txt.c encode.c getopt.c hdr_data.c common.h
				以上、ソース
	makefile.msc		MS-C & ASCII tools用makefile
	makefile.tcc		Turbo C用makefile
	makefile.lcc		LSI C用makefile
	makefile.unx		UNIX用makefile(UNIXでmakeしても動きはします
				が、あまり意味ないような気がする…)
	com2txt.exe		実行可能ファイル
	sample/mybatkey.a86	説明用アセンブリ言語ソースファイル
				(§7・8で使用)
	sample/myecho.a86	おまけ(§7で説明)


§3. 使用法

  使用法は

    com2txt [-c] [-w 出力の行長] [-r] 変換前comファイル名 変換後comファイル名

です。なお、「変換前comファイル」と「変換後comファイル」には同じものを指
定しないで下さい。さもないと、ファイル内容を壊します。

  comファイル名の末尾の「.com」は省略できます。
  -cは、com-batch共用形式での出力を指定するオプションです。これについては
8章で述べます。
  -rは逆変換のオプションで、これを指定すると、com2txtでテキストに変換した
comファイルを、元に戻すことができます。-cを指定してテキスト化したものでも
逆変換できます(逆変換時には-cの指定は不要で、指定しても無視されます)。但
し、Ver 1.01以降のcom2txtでテキスト化したcomファイルをVer 1.00のcom2txtで
元に戻すことはできません。また、-cを指定してテキスト化したcomファイルを、
Ver 1.03までのcom2txtで元に戻すことはできません。いずれも、その逆は可能で
す。
  -wは出力の行長を指定するオプションで、省略すると-w 54が仮定されます。む
ろん、-rが指定されているときは-wは無意味で、仮に指定しても無視されます。
また、出力の最初の部分はデータが固定のため、-wを指定してもこの部分につい
ては行長を変えることはできません。


§4. 使用上の注意

  当然ながら、変換後のファイルは変換前よりサイズが大きくなります。変換後
のファイルのサイズは、-wの指定によっても変わりますが、デフォルトの-w 54の
場合、

	定数(200バイト前後、-cオプションの有無で
	変わる)+変換前のファイルのサイズ×約1.38

程度になります。-wの指定が大きいほど倍率の1.38は小さくなります(が、4/3よ
り小さくなることはありません)。
  comファイルはサイズが(256×255=)65280バイト以下でないと動作しないので、
変換後のファイルサイズがこれを超える場合は動作しません。また、com2txtで変
換されたcomファイルは、実行時のdecodingにスタックエリアを数十バイト使うの
で、変換後のサイズが65280バイトより若干小さいだけの場合も、やはり動作しま
せん。現バージョンでは、少なくとも変換後のサイズが65200バイトまでなら大丈
夫です。変換後のファイルサイズがこれを超える場合、com2txtは警告メッセージ
を出します(若干超えるだけの場合、-wを少し大きく指定すれば、正常に変換でき
ることがあります)。
  また、comファイルでも、起動直後のレジスタやフラグの値について何か仮定を
置いていて、それが満たされないと動作しないような作りのものは、com2txtで変
換すると動作しなくなることがありえます(とは言っても、そういうものがあると
は聞いたことがありませんが…)。これは、com2txtで変換されたcomファイルは起
動時にメモリ上に元のcomのイメージを再現しますが、その際にレジスタが書き換
わってしまうためです。但し、元のcomプログラムにジャンプしてそれを実行し始
める時点では、必ず以下の条件が満たされていますので、これらの仮定は置いて
いてもかまいません: SP = 0xFFFE, AX = 0, BXは元のまま、DS = CS = SS = ES.
  com2txtで変換したファイルは元のファイルと同様に動作しますが、自己復元の
能力はありません―つまり、自己解凍アーカイブのように、そのファイルだけか
ら元のファイルを復元することはできません(元のファイルと同様に動作するのだ
から、当然ではありますが)。復元したければcom2txt -rで行って下さい。
  変換後のファイルをcomファイルとして実際に実行する際は、改行記号は(MS-
DOSのテキストファイルの標準である)CR LFになっていなければならず、LFだけだ
と正常に動作しません。特に、変換後のファイルを一旦UNIXへ転送し、再度DOSに
転送した場合や、UNIX上でコンパイルしたcom2txtで作成したファイルをDOSに転
送した場合などは要注意です。
  com2txtはcomファイルにのみ有効です。exeファイルをcom2txtで変換しても、
実行可能にはなりません(但し、単なるencoder・decoderとしてなら使えなくもな
いですが…)。念のため。特に、ファイル名は「.com」で終わっているが実際には
exeファイルである、というようなのが時にはありますから要注意です。com2txt
は、変換前のファイルがexeファイルであると思われる場合は警告メッセージを出
すようになっています。


§5. 旧バージョンとの差異

  旧バージョンからの変更点は以下の通りです。

    Ver 1.00→Ver 1.01
	・LSI Cに対応した
	・変換後のテキストcomファイルのサイズが若干小さくなった
	・変換前のファイルがexeファイルであったり、変換後のサイズ
	  が大きすぎてcomファイルとして動かせない場合は警告を発す
	  るようにした
	・変換後のテキストcomファイルの最後の1行が1文字だけの場合、
	  その1文字は「=」であり、普通にechoしようとすると「ECHO
	  は <on>です」と出力してしまうため、§7で述べるような使
	  い方をすると正常動作しない、というバグを直した

    Ver 1.01→Ver 1.02
	・指定したファイルがオープンできなかった時のエラー処理を
	  忘れていた(^_^;)ので入れた

    Ver 1.02→Ver 1.03
	・使用コンパイラをこれまでのLSI C 3.30試食版から3.30c試食
	  版に変更。V3.30では「share.exe等ネットワーク関連ソフト
	  が常駐しているときにファイルのオープンが正しくできない
	  場合があ」ったそうなので、com2txtの前バージョンもその影
	  響を受けているかも?
	・-rオプション指定時、逆変換対象ファイルの末尾にゴミがつ
	  いていても、エラーとはせず警告を出すだけとした

    Ver 1.03→Ver 1.10
	・com-batch共用形式の出力を新設した
	・-rオプション指定時に、逆変換対象ファイルの末尾にゴミが
	  ついていた場合に警告を出すのをやめにした

    Ver 1.10→Ver 1.11
	・com-batch共用形式でテキスト化したファイルが、一部のCPU
	  (V30など)で暴走するバグを修正
	・おまけmyecho.a86を追加

  なお、3章でも述べたように、新しいバージョンのcom2txtでテキスト化した
comファイルを、旧バージョンのcom2txtで元に戻すことはできない場合がありま
す。ご注意下さい。


§6. comtとの比較

  先述の通り、comファイルをテキストに変換するツールとしてはすでにcomtが存
在しています。com2txtのcomtとの違いは、先述した「com2txtの出力はechoで生
成できる」という点の他には

	・comtは3→4 encodingの他に1→2 encodingを選択することもできる
	  (変換前のファイルが小さくて1→2 encodingの方が出力が小さくなる
	  場合は自動的にそちらに切り替わる)が、com2txtは3→4 encodingだけ
	・com2txtの出力の方がわずかに小さい(comtが1→2 encodingに自動的
	  に切り替わるケースも含めて)
	・comtのように前後に説明文のwrapperを自動的に付ける機能はない
	・変換後のファイルの起動時のdecoding時間がcomtよりほんのわずかに
	  長い(何十倍もしないとわからないほどの時間差なので、普通気にな
	  らないと思う)

などがあります。


§7. バッチファイルへの埋め込み(その1)

  先述のように、com2txtの出力はechoで生成可能なようになっています。このこ
とを有効に活用すれば、バッチファイルの中でcomファイルを生成して、それを利
用することも可能です。
  例えば、実行途中でユーザからのキー入力を受け付けるような、あるバッチフ
ァイルを作りたいとしましょう。NECの、あるいはVer 3.3以降のMS-DOSには、
batkey.comというコマンドがあり、これを用いればバッチファイル内でキー入力
を受け付けることができます。しかし、そのようなバッチファイルをMS-DOS汎用
に作りたいケースもあるでしょう(例えば、そのバッチファイルを配布して皆で使
うなどの場合)。その場合、batkey.comを持たないシステムもあるわけですから、
batkey.comが使えることを前提に作るわけにはいきません。代案として、batkey.
com(と同等の機能を持つ自作のcomファイル)を、symdebを用いてバッチファイル
内で生成し、それを使うということも考えられますが、これも完全とは言い切れ
ません。というのも、全てのメーカの全てのバージョンのDOSにsymdebがあるとは
限りませんし、また、大学などの教育用の計算機システムをはじめ多人数で共用
することが前提のシステムでは、いたずらでのシステム破壊に対する抑止などの
理由のため、わざとsymdebなど一部のコマンドを抜いた構成になっているケース
もあるからです。
  そこで、まずbatkey.comと同等の自作comファイルを作り(batkey.comそのもの
をコピーして勝手に配布すると著作権法違反になるため)、それをcom2txtでテキ
スト化します。そして、バッチファイル内でそれをechoで生成してから使うよう
にすれば、目的のバッチファイルがDOS汎用に作れるわけです。もっとも、comフ
ァイルを作るには普通、アセンブリプログラミングの知識が必要となりますが…。
  また、こうすることのもう1つの利点として、配布するものがテキストファイル
だけですむという点も挙げられます。あるファイルを配布して皆で使いたいが、
バイナリファイルの配布が不可能あるいは困難(あるいはバイナリ転送の操作が難
しく初心者にとって困難)であるといった場合が、時にはあるものです。そんな時、
com2txtを使ってcomファイルを取り込んだバッチなら、テキストファイルですか
ら問題なく配布可能です。 

  具体例を示してみましょう。batkeyは小さなコマンドなので、やろうと思えば
同等のものをsymdebで作ることも可能です。でも、symdebではラベルが使えない
のが不便なので、ここではLSI-C 3.30試食版のパッケージにセットされている専
用アセンブラr86(とリンカlldの組み合わせ)を使うことにします。(MASMあたりを
使えばいいのでしょうが、筆者はMASMを持っていないもので。それにこれなら無
料で手に入りますしね。)
  まずLSI-Cを入手してセットアップします。次に添付のmybatkey.a86(本パッケ
ージの、ディレクトリsampleの下にあります)を、次のようにしてアセンブルしま
す。

	r86 mybatkey
	lld -Fc mybatkey -o mybatkey.com

  これで、mybatkey.comというcomファイルが生成できます(146バイト)。その使
い方は、batkey.comとほとんど同じ(引数がない場合のUsageメッセージだけが異
なる)で、次のようになっています。

	Usage: mybatkey 機能 [プロンプト]

  但し、「機能」には0, 1, 2のいずれかを指定します。どれを指定するかによっ
て、次のような動作をします。

	機能=0 … ユーザが0~9の数字をキー入力するまで待ち、入力
		   されたキーに応じて0~9のERRORLEVELを返す。
	機能=1 … ユーザがY(y)又はN(n)をキー入力するまで待ち、入
		   力されたのがY(y)なら0を、そうでなければ255を
		   ERRORLEVELとして返す。
	機能=2 … ユーザが入力したキーのASCIIコードをERRORLEVELと
		   して返す。

  mybatkey.comができたところで、以下のように操作します。

	com2txt mybatkey.com batkytxt.com

  すると、mybatkey.comと等機能で、しかもecho可能なcomファイル、batkytxt.
comができます。その内容は次のようになっているはずです(但し、各行の先頭に
空白はありません)。

	T_OOWW3=XXWX5 2PY5w3P_-l.P-KD1Ep-OLPZ-pJP-pw40PQX5fsPu
	com2txt/Nide5Fe,xPQX-=.PQX-MQP-xx4_P5rjP5Z2P-jE,JP=
	5O2,APQX5R8P-rJPPRX5iBP-x=PRX5TsP59DHHP5rIHP-w64ZP=
	40-2APQX-MiP-trP5_WP-pBP51w,pPTYPZPZP__ox44b87A4.wh0pA
	t2HhEKC484wMhb5Ch34AOS82ECPj94P4ksxoWmDCMH3.ACLtab736r
	gPT5litCBppO4isySvp4Cvp59QLsRD8XWLBAB480WSmOFyt9NoKUWM
	aYvTzHFIa1Fme0RA9LBpqKCI7HGAr3vup1B4nKbxMBbRtB3iZ42taz
	9yG.CtM14V4ORAv72L:

  そこでこれを、エディタなどで編集してバッチファイルの中に取り込みます。
例えば、次のようなバッチファイルを作ったとします。

    :---- バッチファイルの始まり
    echo off

    :---- comファイルの生成
    echo T_OOWW3=XXWX5 2PY5w3P_-l.P-KD1Ep-OLPZ-pJP-pw40PQX5fsPu> batkytxt.com
    echo com2txt/Nide5Fe,xPQX-=.PQX-MQP-xx4_P5rjP5Z2P-jE,JP=>> batkytxt.com
    echo 5O2,APQX5R8P-rJPPRX5iBP-x=PRX5TsP59DHHP5rIHP-w64ZP=>> batkytxt.com
    echo 40-2APQX-MiP-trP5_WP-pBP51w,pPTYPZPZP__ox44b87A4.wh0pA>> batkytxt.com
    echo t2HhEKC484wMhb5Ch34AOS82ECPj94P4ksxoWmDCMH3.ACLtab736r>> batkytxt.com
    echo gPT5litCBppO4isySvp4Cvp59QLsRD8XWLBAB480WSmOFyt9NoKUWM>> batkytxt.com
    echo aYvTzHFIa1Fme0RA9LBpqKCI7HGAr3vup1B4nKbxMBbRtB3iZ42taz>> batkytxt.com
    echo 9yG.CtM14V4ORAv72L:>> batkytxt.com

    :---- 作ったbatkytxt.comを使う
    echo 画面クリアを実行します
    batkytxt 1 よろしいですか(y/n)?
    if ERRORLEVEL 255 goto TERMIN

    :---- 画面クリア
    cls
    goto FIN

    :---- 処理の中止
    :TERMIN
    echo.
    echo 中止します

    :---- batkytxt.comを消して終了
    :FIN
    del batkytxt.com

    :---- バッチファイルの終わり

  こうすれば、画面クリアを行う前にユーザに確認のキー入力を求めるバッチフ
ァイルが、DOS汎用に作れるわけです。上の例では、batkytxt.comをechoで生成す
る際に、最初は「>」、次からは「>>」を使っている点にご注意下さい。また、
echoの引数と「>」の間に空白を入れてはいけません。入れると、echoがその空白
まで出力してしまう(UNIXと異なり…)ため、comファイルが正しく動作しなくなり
ます。
  もちろん、上の例は説明用にごく単純化した例です。実用的には、効率やその
他の観点からまだいろいろ工夫の余地があるでしょう。一例としては、環境変数
TMPが存在する場合は、それに設定されている値は多分、RAMディスクなどの高速
アクセスが可能な媒体に存在するディレクトリの名前でしょうから、comファイル
をそのディレクトリへ作成するようにすれば、作成もその実行も高速化が期待で
きる、などが考えられます。
  この手法を進展させたソフトとして、作者による別ソフトdsharがあります。バ
ッチファイル型の自己解凍アーカイブを作るソフトです。興味のある方はご利用
になってみて下さい。

  [蛇足] 細かい話をすれば、本章で作った上記バッチファイルもまだ完全に機種
非依存とは言えません。「echo.」で改行ができるかどうかがDOSのバージョンに
依存するからです。ここも完全に汎用にしたければ、echoの小さな拡張版のよう
なコマンドをcomファイルで作って、com2txtを使って同様の手法によりバッチに
組み込むといった対策が必要になるでしょう。
  そのためのサンプル・アセンブリ言語ファイルを、おまけとして付けておきま
した。ディレクトリsampleの下のファイルmyecho.a86です。mybatkey.a86と同様
にしてアセンブルし、myecho.comを生成してお使い下さい。myecho.comの使い方
は、myecho.a86に書いてあります。


§8. バッチファイルへの埋め込み(その2)

  7章で説明した方法には欠点もあります。取り込みたいcomファイルが大きい場
合、バッチの先頭でechoを何百回も繰り返すことになるので起動が遅くなり、非
現実的になってくるということです。そんな場合、もし取り込みたいcomファイル
が1つだけであるなら、それを、丸ごとバッチファイルとしても使えるような形に
テキスト化しておき、comファイルの生成にはechoに代えてcopyを使うようにすれ
ば、生成が断然速くなります。
  com2txtはVer 1.10から、オプション-cの指定によりこの形式の出力ができるよ
うになりました。また、この形式を「com-batch共用形式」と呼ぶことにしました。

  では、7章で使ったmybatkeyを利用して7章と同じ機能のバッチファイルを作る
例を題材に、com-batch共用形式のテキストcomファイルを使ったバッチの具体的
な作り方を説明しましょう。
  7章と同様にしてmybatkey.comを作り、次いで以下のように操作します。

	com2txt -c mybatkey.com batktxt2.com

  すると、batktxt2.comというファイルができます。その内容は次のようになっ
ているはずです(但し、各行の先頭に空白はありません)。

	:=%00%AA5$QP^-rOP_)5-W%,pP5m<P5U(P52>P-`v,@P-!?4fP5Feu
	:com2txtNide,xP5k'P-cC4SPHHHPP502,nP%@@5t@P-t=PVX5!bP=
	:=5?FP5?IP5x<-6vP52sPVX5.{P-J)5A=P5!z,JP%!1P-pB,1P5lw=
	:=PTYP_P_P##
	  --- Insert lines here. File size must be <=65200 bytes.
	*ox@@b|}A@`wh^pAt\HhEKC@|@wMhb?Ch[@AOS|\ECPj{@P@ksxoWm
	DCMH[`ACLtab}[~rgPT?litCBppO@isySvp@Cvp?{QLsRD|XWLBAB@
	|^WSmOFyt{NoKUWMaYvTzHFIa]Fme^RA{LBpqKCI}HGAr[vup]B@nK
	bxMBbRtB[iZ@\taz{yG`CtM]@V@ORAv}\L
	:

  このファイルは、やはりmybatkey.comと等機能ですが、以下の性質があります。

	1) 7章で作ったbatkytxt.comと異なり、必ずしもecho可能な文字ばかり
	   からはできていない。
	2) 「--- Insert lines here」の直前の「##」から直後の「*」までは、
	   どんな内容に変更しても構わない。但し、最後の「*」の直前は改行
	   でなければならず、またこの間に行頭が「*」であるような行が入っ
	   てはならない。他には制約はない。「--- Insert lines here」の行
	   を削ってもいいし、何行付け加えてもいい。
	3) ファイルの最後の「:」より後にも、任意の内容を付け加えてよい。

むろん、4章で述べた理由により、内容変更後にもファイルサイズが65200バイト
以下に収まっていなければなりませんので注意して下さい。

  そこで、このファイルを編集して次のような内容のファイルを作り、mybatch.
batと改名してしまいます(但し、各行の先頭に空白はつけません)。

	:=%00%AA5$QP^-rOP_)5-W%,pP5m<P5U(P52>P-`v,@P-!?4fP5Feu
	:com2txtNide,xP5k'P-cC4SPHHHPP502,nP%@@5t@P-t=PVX5!bP=
	:=5?FP5?IP5x<-6vP52sPVX5.{P-J)5A=P5!z,JP%!1P-pB,1P5lw=
	:=PTYP_P_P##
	echo off
	:--- バッチファイル本体ここから始まり

	:--- まずはcomファイルの生成
	if EXIST %0.bat goto CASE1
	copy %0	batktxt2.com
	goto COMMON
	:CASE1
	copy %0.bat batktxt2.com
	:COMMON

	:---- 作ったbatktxt2.comを使う
	echo 画面クリアを実行します
	batktxt2 1 よろしいですか(y/n)?
	if ERRORLEVEL 255 goto TERMIN

	:---- 画面クリア
	cls
	goto FIN

	:---- 処理の中止
	:TERMIN
	echo.
	echo 中止します

	:---- 中止の場合もそうでない場合も、batktxt2.comを消して終了
	:FIN
	del batktxt2.com

	:---- 続くcom命令部を飛ばしてバッチファイルの最後へ
	goto END_OF_BATCH

	*ox@@b|}A@`wh^pAt\HhEKC@|@wMhb?Ch[@AOS|\ECPj{@P@ksxoWm
	DCMH[`ACLtab}[~rgPT?litCBppO@isySvp@Cvp?{QLsRD|XWLBAB@
	|^WSmOFyt{NoKUWMaYvTzHFIa]Fme^RA{LBpqKCI}HGAr[vup]B@nK
	bxMBbRtB[iZ@\taz{yG`CtM]@V@ORAv}\L
	:END_OF_BATCH

    (注意) これを実際に動かしてみて、「1個のファイルをコピーしました」の
    メッセージが目障りに感じるなら、copyを使っている2行をそれぞれ以下のよ
    うに変更して下さい。

	copy %0	batktxt2.com	 を type %0 > batktxt2.com     に
	copy %0.bat batktxt2.com を type %0.bat > batktxt2.com に

  このファイルは、上記の「性質」の中で述べた、変更の制限を満たしているこ
とにご注意下さい。つまり、元のファイルの「--- Insert lines here」の行があ
った所に、新たな内容を加え、逆に「--- Insert lines here」の行を削ったので
すが、この部分には行頭が「*」であるような行は入っておらず、またこれに続く
「*」の直前もちゃんと改行になっています。また、元ファイル最後の「:」以降
にも内容を追加しました。むろん、大きさも65200バイト以内に収まっています。
  よって、このバッチファイルは、batktxt2.comという名前にコピーすると、
comファイルとしても働くのです。当然、comファイルとして動かす場合の働きは、
mybatkey.comと同じです。そして、このバッチファイルの内部ではそのことを利
用し、自分自身のコピーをcomファイルとして用いています。
  これで、7章で作ったバッチと同じ働きのバッチファイルが、別なやり方で作れ
たわけです。さっきとの違いは、さっきはバッチ内部で使うcomファイルをechoで
生成したのに対し、今回はcopyで生成したため生成が速くなった点です。
  注意点としては、バッチの本体処理の後に「*ox@@b…」といったcomファイルの
命令部が続くので、バッチとしてはそこを実行しないよう、gotoを使ってそこを
飛び越さねばなりません。また、最初の方に「:」で始まる行が数行あるので、自
分で使うgotoのラベルがこれと衝突しないようにして下さい(といっても、goto
com2txtNide,xP5…とか、goto =5lwPTY…なんてラベル使う人いないか)。
  それから、途中のcopy %0 batktxt2.comは、%0にそのバッチのファイル名が入
ることを利用して、それをcomファイルにコピーしようとしているものです。この
ことによって、そのバッチ自身のファイル名に依存しないバッチが作れます。
if EXIST…で分岐しているのは、当該バッチが「mybatchリターン」と起動されて
も「mybatch.batリターン」と起動されても支障なく動くようにとの配慮です。

  本章で説明したやり方なら、取り込みたいcomファイルが多少大きくとも、7章
のようにechoでの生成に時間を食うこともありません。逆に、この方法では2つ以
上のcomファイルを取り込むことはできないし、バッチのサイズが65200バイトを
超えることもできないので、2つの方法を適宜使い分けて下さい。大きなcomファ
イル1つをこの方法で取り込み、その他の比較的小さなcomファイルは7章の方法で
取り込む、といったやり方も可能です。
  むろん7章と同様、この例も説明用にごく単純化した例であり、実用的には、効
率やその他の観点からいろいろ工夫の余地があるでしょう。


§9. 自己解凍テキストcomファイルの作成

  com2txt自身にはアーカイブを作るなどの能力はありませんが、別にアーカイブ
ソフトがある場合、もしそのソフトに「com型の自己解凍アーカイブファイルを作
る能力」があれば、それで作成したcom型の自己解凍アーカイブをcom2txtで再処
理することにより、テキストの(つまりメールで送れて、相手側ではdecoderがな
くても解凍できる)自己解凍アーカイブを作成できるわけです。
  ただ、「com型の自己解凍アーカイブファイルを作成できるアーカイバ」という
のは、現在のところ作者はlharcしか知りません。comtの作者もこれ以外には知ら
ないそうです。lharcは自己解凍アーカイブの生成結果がcomファイルとして許さ
れる大きさに収まる限り、com型の自己解凍アーカイブファイルを作成します。そ
こで、com2txtとlharcを併用すれば「テキストのcom型の自己解凍アーカイブ」が
作れることになります。LHaではこれはできません。LHaは常にexe型の自己解凍ア
ーカイブを作るからです。
  comtでも同様のことができ、comtにはそのための専用のユーティリティとして
comtarcというものが付属しています。com2txtにはそれに相当するものは付けて
いませんので、手動あるいはバッチファイルなど適当な手段によってlharcと併用
して下さい。
  (なお、comの大きさに収まらないような自己解凍アーカイブをテキスト形式で
作りたければ、7章末尾で紹介したdsharをお使い下さい。同じftpサイトで配布し
ております)