将任意文件转化为批处理
2006-08-14
写这个程序的时候还是 Win95/98 和 TC2 的年代。源码的最后经改进的版本已轶(大概其中修复了换行符的问题,并且支持了大于 64kB 的文件)。今整理旧文时只找到了第一次发表在网页上时的源码 .bat 文件。

写这个程序的目的在于许多论坛不允许上传文件,其次,为了在他人 QQ 下线后仍然可以以文本形式发送 exe 程序。 例如,可将一个如下的 greeting.vbs 文件

msgbox("Hello World!")
打包为 greeting.bat
echo off
cls
debug <%0 >nul
copy wcr.wcr greet.vbs
del wcr.wcr
exit
e100 6D 73 67 62 6F 78 28 22 48 65 6C 6C 6F 20 57 6F
e110 72 6C 64 21 22 29
n wcr.wcr
rcx
16
w
q
这个程序在95/98下开发测试.现在流行 WinXP,不能保证 100% 兼容。或在 XP 下生成 .bat 较慢。(我不知道这个BUG是怎么产生的,似乎是XP特有的,或许不在于这个程序本身,而是操作系统的问题。)

echo off

cls
debug <%0 >nul
copy wcr.wcr tobat.c
del wcr.wcr
exit
e100 23 69 6E 63 6C 75 64 65 20 3C 73 74 64 69 6F 2E
e110 68 3E D A 23 69 6E 63 6C 75 64 65 20 3C 73 74
e120 64 6C 69 62 2E 68 3E D A 46 49 4C 45 20 2A 66
e130 69 6E 2C 2A 66 6F 75 74 3B D A 63 68 61 72 20
e140 66 69 6C 65 6E 61 6D 65 5B 31 30 30 5D 3B D A
e150 63 68 61 72 20 46 4E 41 4D 45 5B 31 30 30 5D 3B
e160 D A 75 6E 73 69 67 6E 65 64 20 6C 6F 6E 67 20
e170 66 69 6C 65 73 69 7A 65 3B D A 69 6E 74 20 6D
e180 61 69 6E 28 29 7B D A 75 6E 73 69 67 6E 65 64
e190 20 69 6E 74 20 63 68 3B D A 9 70 72 69 6E 74
e1A0 66 28 22 53 6F 75 72 63 65 20 66 69 6C 65 20 6E
e1B0 61 6D 65 3A 20 22 29 3B D A 9 67 65 74 73 28
e1C0 66 69 6C 65 6E 61 6D 65 29 3B D A 9 66 69 6E
e1D0 3D 66 6F 70 65 6E 28 66 69 6C 65 6E 61 6D 65 2C
e1E0 22 72 62 22 29 3B D A 9 69 66 28 66 69 6E 3D
e1F0 3D 4E 55 4C 4C 29 7B D A 9 9 70 72 69 6E 74
e200 66 28 22 5C 6E 25 73 5C 6E 45 72 72 6F 72 20 46
e210 69 6C 65 21 21 21 5C 6E 22 2C 66 69 6C 65 6E 61
e220 6D 65 29 3B D A 9 9 72 65 74 75 72 6E 20 30
e230 3B D A 9 7D D A 9 70 72 69 6E 74 66 28 22
e240 4F 75 74 70 75 74 20 66 69 6C 65 28 2A 2E 62 61
e250 74 29 3A 20 22 29 3B D A 9 67 65 74 73 28 46
e260 4E 41 4D 45 29 3B D A 9 66 6F 75 74 3D 66 6F
e270 70 65 6E 28 46 4E 41 4D 45 2C 22 77 22 29 3B D
e280 A 9 66 69 6C 65 73 69 7A 65 3D 30 3B D A 9
e290 66 70 72 69 6E 74 66 28 66 6F 75 74 2C 22 65 63
e2A0 68 6F 20 6F 66 66 5C 6E 5C 6E 63 6C 73 5C 6E 64
e2B0 65 62 75 67 20 3C 25 25 30 20 3E 6E 75 6C 5C 6E
e2C0 63 6F 70 79 20 77 63 72 2E 77 63 72 20 25 73 5C
e2D0 6E 64 65 6C 20 77 63 72 2E 77 63 72 5C 6E 65 78
e2E0 69 74 22 2C 66 69 6C 65 6E 61 6D 65 29 3B D A
e2F0 9 77 68 69 6C 65 28 31 29 7B D A 9 9 63 68
e300 3D 66 67 65 74 63 28 66 69 6E 29 3B D A 9 9
e310 69 66 28 66 65 6F 66 28 66 69 6E 29 29 62 72 65
e320 61 6B 3B D A 9 9 69 66 28 66 69 6C 65 73 69
e330 7A 65 25 31 36 3D 3D 30 29 7B D A 9 9 9 66
e340 70 72 69 6E 74 66 28 66 6F 75 74 2C 22 5C 6E 65
e350 25 6C 58 22 2C 66 69 6C 65 73 69 7A 65 2B 30 78
e360 31 30 30 29 3B D A 9 9 7D D A 9 9 66 69
e370 6C 65 73 69 7A 65 2B 2B 3B D A 9 9 66 70 72
e380 69 6E 74 66 28 66 6F 75 74 2C 22 20 25 58 22 2C
e390 63 68 29 3B D A 9 7D D A 9 66 70 72 69 6E
e3A0 74 66 28 66 6F 75 74 2C 22 5C 6E 6E 20 77 63 72
e3B0 2E 77 63 72 5C 6E 72 63 78 5C 6E 25 6C 58 5C 6E
e3C0 77 5C 6E 71 5C 6E 22 2C 66 69 6C 65 73 69 7A 65
e3D0 29 3B D A 9 66 63 6C 6F 73 65 28 66 69 6E 29
e3E0 3B D A 9 66 63 6C 6F 73 65 28 66 6F 75 74 29
e3F0 3B D A 9 72 65 74 75 72 6E 20 30 3B D A 7D
e400 D A
n wcr.wcr
rcx
302
w
q

后记:那时候不用IDE,直接拿debug也能写各种工具与有趣的程序,还用来写过仅依赖bios接口的自己的启动扇区程序。才没过几年,16位的技巧与int 21h已经生疏。