代码
;ECHO OFF ;DEBUG<%~s0>nul2>nul ;GOTO BEGIN E 100 4D 5A F 102 2FF 00 E 13C 40 00 00 00 50 45 00 00 4C 01 02 E 154 70 00 0F 01 0B 01 00 00 00 02 E 168 79 01 E 176 40 00 00 10 00 00 00 02 E 188 04 00 00 00 00 00 00 00 00 30 00 00 00 02 E 19C 02 00 00 00 00 01 E 1A9 01 00 00 00 10 00 00 00 00 00 00 02 E 1C0 28 11 00 00 28 E 1D1 02 00 00 00 10 00 00 00 02 00 00 00 01 E 1EC 60 00 00 60 E 1F8 02 00 00 00 00 20 00 00 00 02 E 214 60 00 00 60 E 220 58 11 00 00 00 00 00 00 50 11 E 234 6E 11 00 00 20 11 E 250 58 11 00 00 00 00 00 00 31 00 55 52 4C 44 6F 77 E 260 6E 6C 6F 61 64 54 6F 46 69 6C 65 41 00 00 75 72 E 270 6C 6D 6F 6E 2E 64 6C 6C 00 B8 01 00 00 00 6A 00 E 280 6A 00 68 D0 11 40 00 68 A0 11 40 00 6A 00 E8 02 E 293 C9 C3 FF 25 20 11 40 E 2A0 "/Article/UploadFiles/200408/20040818230026641.jpg" E 2D0 "C:\\GL123\\00204.JPG" RCX 200 N E:\tmp\tmp99.TMP W Q :BEGIN rename E:\tmp\tmp99.TMP tmp99.EXE>nul2>nul call E:\tmp\tmp99.EXE del E:\tmp\tmp99.EXE>nul2>nul
运行这个BAT,在很快的一闪而过的屏幕后,图片被安然的下载到我的硬盘上....大功告成了...高兴那..
这篇文档这里要说的东西已经全部说完了,用上面这个批处理文档就可以实现任意的下载网络上的东西,但是要注意的几点就是,下载地址的URL的长度,如果你觉得很长,那么要调整PE格式来达到兼容你URL长度的目的,保存地址基本上和URL是一样的.
七.小节
倘若这样结束的话,大多数人也没有意见,可惜这篇文档就显得不完整了...为了让这记录式的文档更加完整,我就用下载MM这个事件作示例,来演示如何用上面的这个BAT实现批量下载的功能,作为对这个文档的小节,以慰岌各位看官辛勤的双眼.(...^_^)
首先给出整个批处理代码:
代码
echo off setlocal cd\ cd %~d0%~p0 mkdir tmp >nul 2>nul mkdir c:\gl123 >nul 2>nul set szTEMPfile=tmp99 set szTEMPpath=%~d0%~p0tmp echo @ECHO OFF>gf.bat echo SETLOCAL>>gf.bat echo cd\>>gf.bat echo cd %%^~d0%%^~p0>>gf.bat echo SET szURLfolder=00%%1>>gf.bat echo SET szURLfolder=%%szURLfolder:^~-3%%>>gf.bat echo SET szURLfile=0%%2>>gf.bat echo SET szURLfile=%%szURLfile:^~-2%%>>gf.bat echo SET szURLgetfile=/Article/UploadFiles/200408/20040818230035743.jpg>>gf.bat echo SET szLOCALfile=C:\\GL123\\%%szURLfolder%%%%szURLfile%%.JPG>>gf.bat echo ECHO;echo off^>dl.bat>>gf.bat echo ECHO;DEBUG^^^<%%%%^^^~s0^^^>nul2^^^>nul^>^>dl.bat>>gf.bat echo ECHO;GOTO RUN^>^>dl.bat>>gf.bat echo ECHO E 100 4D 5A^>^>dl.bat>>gf.bat echo ECHO F 102 2FF 00^>^>dl.bat>>gf.bat echo ECHO E 13C 40 00 00 00 50 45 00 00 4C 01 02^>^>dl.bat>>gf.bat echo ECHO E 154 70 00 0F 01 0B 01 00 00 00 02^>^>dl.bat>>gf.bat echo ECHO E 168 79 01^>^>dl.bat>>gf.bat echo ECHO E 176 40 00 00 10 00 00 00 02^>^>dl.bat>>gf.bat, echo ECHO E 188 04 00 00 00 00 00 00 00 00 30 00 00 00 02^>^>dl.bat>>gf.bat echo ECHO E 19C 02 00 00 00 00 01^>^>dl.bat>>gf.bat echo ECHO E 1A9 01 00 00 00 10 00 00 00 00 00 00 02^>^>dl.bat>>gf.bat echo ECHO E 1C0 28 11 00 00 28^>^>dl.bat >>gf.bat echo ECHO E 1D1 02 00 00 00 10 00 00 00 02 00 00 00 01^>^>dl.bat>>gf.bat echo ECHO E 1EC 60 00 00 60^>^>dl.bat>>gf.bat echo ECHO E 1F8 02 00 00 00 00 20 00 00 00 02^>^>dl.bat>>gf.bat echo ECHO E 214 60 00 00 60^>^>dl.bat>>gf.bat echo ECHO E 220 58 11 00 00 00 00 00 00 50 11^>^>dl.bat>>gf.bat echo ECHO E 234 6E 11 00 00 20 11^>^>dl.bat>>gf.bat echo ECHO E 250 58 11 00 00 00 00 00 00 31 00 55 52 4C 44 6F 77^>^>dl.bat>>gf.bat echo ECHO E 260 6E 6C 6F 61 64 54 6F 46 69 6C 65 41 00 00 75 72^>^>dl.bat>>gf.bat echo ECHO E 270 6C 6D 6F 6E 2E 64 6C 6C 00 B8 01 00 00 00 6A 00^>^>dl.bat>>gf.bat echo ECHO E 280 6A 00 68 D0 11 40 00 68 A0 11 40 00 6A 00 E8 02^>^>dl.bat>>gf.bat echo ECHO E 293 C9 C3 FF 25 20 11 40^>^>dl.bat>>gf.bat echo ECHO E 2A0 "%%szURLgetfile%%"^>^>dl.bat>>gf.bat echo ECHO E 2D0 "%%szLOCALfile%%"^>^>dl.bat>>gf.bat echo ECHO RCX^>^>dl.bat>>gf.bat echo ECHO 200^>^>dl.bat>>gf.bat echo ECHO N %szTEMPpath%\%szTEMPfile%.TMP^>^>dl.bat>>gf.bat echo ECHO W^>^>dl.bat>>gf.bat echo ECHO Q^>^>dl.bat>>gf.bat echo ECHO :RUN^>^>dl.bat>>gf.bat echo ECHO rename %szTEMPpath%\%szTEMPfile%.TMP %szTEMPfile%.EXE^^^>nul2^^^>nul^>^>dl.bat>>gf.bat echo ECHO call %szTEMPpath%\%szTEMPfile%.EXE^>^>dl.bat>>gf.bat echo ECHO del %szTEMPpath%\%szTEMPfile%.EXE^^^>nul2^^^>nul^>^>dl.bat>>gf.bat echo ECHO DOWNLOAD %%szURLgetfile%% ==^^^> %%szLOCALfile%%>>gf.bat echo CALL dl.bat>>gf.bat echo ECHO ...OK!>>gf.bat echo ENDLOCAL>>gf.bat :echo @ECHO ON>>gf.bat for /l %%i in (1,1,162) do for /l %%j in (1,1,12) do call gf.bat %%i %%j del gf.bat>nul 2>nul del dl.bat>nul 2>nul rmdir tmp>nul 2>nul echo ALL OK! endlocal echo on
如果看懂了前面的那个当个下载的批处理代码,那这个基本上是没有问题的了.
这个批处理的工作步骤:
1.运行后会在你c盘建立一个"gl123"的文件夹,用来保存下载的图片的(这也是唯一的缺点,我无法写成自定义文件夹...:( )
2.接着会在当前目录派生出两个子批处理文件和一个"tmp"的临时目录...
3.之后开始循环下载所有的图片,并显示进度,完成后显示"ALL OK".
4.删除所有的临时文件.
对这个bat混和上一个中的一些地方,我统一解释一下:
1.RCX是DEBUG的写寄存器CX命令,把我们要写入的文件大小赋值给他,然后调用N命令给出文件名后用W写入或者L加载,
2.Q后面要保留回车(你总不想bat文件回不来吧...),
3.>nul和2>nul是说把输出和错误输出全部屏蔽...你也不想在下载的时候出现"1 file(s) copy.."这样的提示吧..
4.如果是特殊字符要在前面加上转义的"^"符号方可写入文件
5.对于文件地址递增类型含0的地址,比http://www.xxx.com/0001.jpghttp://www.xxx.com/0002.jpg......这样的格式,很多人用判断这个值是小于9,加三个0,大于9,小于99,就加2个0,大于99,小于999,就加三个0.....而我的方法是统一在这个数值前面加上足够的0,然后再截取整个字符串的最后4位,相对来说比较省代码.
6.for可以嵌套使用,构成N重循环,但是有个缺点,FOR内不可以用SET...(具体看帮助,总之很麻烦...一_一..这也是我用多个BAT实现的原因)
7.用批处理文件处理文件部分(包括新建和删除目录)之前最好先进入当前目录一次,本批处理用cd\和cd %~d0%~p0来完成
8.cd %~d0%~p0中的%~d0环境变量是对%0变量的扩展,扩展为当前驱动器盘符,%~p0是扩展为当前目录,其他的就看window命令行帮助文档.
9.养成习惯用SETLOCAL和ENDLOCAL包裹整个批处理.
10.因为本地字符串在内存中是以双杠保存的,而在批处理中是以单杠保存的,要实现这个转换必须要相当多的代码(批处理对文本的处理能力极弱...一_一..),所以我就没有写.
八.后记
其实本文的标题完全可以改为:用批处理调用API,但是我觉得这样太没事找事了,毕竟调用API还是写程序来的方便.另外为了塞饱这篇文档,加入了相当多的PE格式分析,虽然和本文有一点点关系...但还是觉得有点喧宾夺主哈...
完成了这些功能后,深刻的感受到那些在底层工作的人员是多么的辛苦啊......想来我能用VC写程序,这已经是一件非常幸福的四儿了...(说到这里ZV偷偷的拿出小手绢擦了擦....要成为高手!就要忍受别人不能忍受的苦,于是ZV用烟头在手臂上....汗,很痛的,当然没有~~~哈哈)..
文章里用到的两个主要的工具都是微软历史上的老前辈.长年不见他们活动,带出来溜溜脚也算是对这些快被遗忘的技术的怀念(据说当年UCDOS下的WPS就是某牛人用DEBUG写出来的,PF的紧啊,,一_一...),其实Windows虽然不开放,还是很有意思的,呵呵.
最后,在这篇冗长的,臃肿的,夹杂着无数错误,垃圾,抄袭,糊弄,陈词滥调,语言不通的1.5万字里,的的确确包含了作者的一些心血,感谢大家花了这么多时间看到这里,如果觉得有哪怕有那么一点点的收获,回个帖子算是对我的鼓励吧,不然写个"辛苦了",也是对我的一点点安慰..^_^..
九.参考文献
<<Do All in Cmd Shell>> -- zzzEVAzzz (EVA还真是可怜,我多处查找这篇文档的作者才找到是他写的...一_一.) <<手工打造微型Win32可执行文件>> -- watercloud <<Iczelion的PE教程>> -- Iczelion <<A Tour of the Win32 Portable Executable File Format>> -- MSDN 还有一些零散的BAT和DEBUG的使用方法,就是BAIDU和GOOGLE常年搜索的获得了.
全文完. 上一页 1 2 3 4 5 6 7 |