[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

any2bat之批处理版和VBS版

利用certutil实现在批处理中嵌入exe文件的方法(不依赖debug命令)
http://bbs.bathome.net/thread-41604-1-1.html

【BAT】利用Debug把文件放到批处理脚本中
原文地址:http://www.cn-dos.net/forum/viewthread.php?tid=46874
  1. ::=====================================================
  2. :: code by freeants  CMD@XP  version:1.00
  3. ::=====================================================
  4. @echo off
  5. cd/d "%~dp0">nul
  6. if "%~z1" equ "" goto:usage
  7. if %~z1 gtr 65280 goto:NOT_SUPPORT
  8. setlocal ENABLEDELAYEDEXPANSION
  9. copy/b "%~1" $$$>nul
  10. set/a D_NUM=%~z1+255
  11. call:DEC_HEX %D_NUM% >nul
  12. echo @echo off>"%~n1.cmd"
  13. echo more +5 "%%~0"^|debug^&graftabl 936^>nul>>"%~n1.cmd"
  14. echo copy/b/y $tmp$ "%~nx1"^>nul>>"%~n1.cmd"
  15. echo del/a/f/q $tmp$>>"%~n1.cmd"
  16. echo goto:eof>>"%~n1.cmd"
  17. for /f "eol=- skip=1 tokens=*" %%i in ('^(echo d100,%FILE_SIZE%^&echo q^)^|debug $$$^&^&del $$$') do (
  18.     set op=%%i
  19.     set op=!op:-= !
  20.     echo e!op:~5,53! 2>nul>>"%~n1.cmd"
  21. )
  22. echo rcx>>"%~n1.cmd"
  23. call:DEC_HEX %~z1 >nul
  24. echo %FILE_SIZE%>>"%~n1.cmd"
  25. echo n$tmp$>>"%~n1.cmd"
  26. echo w>>"%~n1.cmd"
  27. echo q>>"%~n1.cmd"
  28. goto :EOF
  29. :DEC_HEX
  30.     set FILE_SIZE=
  31.     set PATTERN=123456789ABCDEF
  32.     set dec=%1
  33.     :WHILE
  34.     set /a res=%dec%%%16-1
  35.     set /a dec/=16
  36.     set res=!PATTERN:~%res%,1!
  37.     set FILE_SIZE=%res%%FILE_SIZE%
  38.     if "%dec%" neq "0" goto WHILE
  39. goto:eof
  40. :usage
  41.     echo.================================================
  42.     echo 你没有指定要处理的文件或指定的文件不存在……
  43.     echo.
  44.     echo 用法:
  45.     echo       %~n0 fileName
  46.     echo.================================================
  47. goto:eof
  48. :NOT_SUPPORT
  49.    echo 指定的文件过大,脚本(%~nx0)不能处理……
  50.    pause
  51. goto:eof
复制代码
【VBS】any2bat.vbs
原文地址:http://www.cn-dos.net/forum/viewthread.php?tid=36797
  1. 'any2bat        {s11ss 2008-1-5}
  2. '获取要转换的文件:
  3. If Not WScript.Arguments.Count=1 Then WScript.Quit
  4. Set fso=CreateObject("scripting.filesystemobject")
  5. Set f=fso.GetFile(WScript.Arguments(0))
  6. If Err Then WScript.Quit
  7. If f.Size=0 Then WScript.Quit
  8. '获取文件2进制代码:
  9. Set stream=CreateObject("adodb.stream")
  10. With stream
  11.         .Type=1:.Open:.LoadFromFile f
  12. End With
  13. bin=stream.Read(f.Size)
  14. '生成bat:
  15. n=&h100:str=""
  16. Set bat=fso.CreateTextFile(f.Path&".bat")
  17. bat.WriteLine "@more <""%~f0"" +1|debug>nul&&move t """&f.Name&"""&goto :eof"
  18. For i=1 To Lenb(bin)
  19.         zero=""
  20.         one=Ascb(Midb(bin,i,1))
  21.         If one<16 Then zero="0"
  22.         str=str&" "&zero& Hex(one)
  23.         If i Mod 16=0 Then bat.WriteLine "e"& Hex(n)&str:str="":n=n+16
  24. Next
  25. If Not str="" Then bat.WriteLine "e"& Hex(n)&str
  26. bat.WriteLine "n t"
  27. bat.WriteLine "rcx"
  28. bat.WriteLine Hex(f.Size)
  29. bat.WriteLine "w"
  30. bat.WriteLine "q"
  31. stream.Close:bat.Close
  32. Set stream=Nothing:Set f=Nothing:Set bat=Nothing:Set fso=Nothing
  33. WScript.Echo "Successful!"
复制代码
在与knoppix7兄的探讨中,知道了bx的作用,特作修改使待转换的文件的大小“理论上”无限制(因为处理64KB以上的文件还是比较慢):
  1. 'any2bat        {s11ss 2008-1-6}
  2. '获取要转换的文件:
  3. If Not WScript.Arguments.Count=1 Then WScript.Echo "把要转换的文件托拽到我身上!":WScript.Quit
  4. Set fso=CreateObject("scripting.filesystemobject")
  5. Set f=fso.GetFile(WScript.Arguments(0))
  6. If Err Then WScript.Quit
  7. If f.Size=0 Then WScript.Quit
  8. '获取文件2进制代码:
  9. Set stream=CreateObject("adodb.stream")
  10. With stream
  11.         .Type=1:.Open:.LoadFromFile f
  12. End With
  13. bin=stream.Read(f.Size)
  14. '生成bat:
  15. n=&h100:str=""
  16. Set bat=fso.CreateTextFile(f.Path&".bat")
  17. bat.WriteLine "@more <""%~f0"" +1|debug>nul&&move t """&f.Name&"""&goto :eof"
  18. For i=1 To Lenb(bin)
  19.         zero=""
  20.         one=Ascb(Midb(bin,i,1))
  21.         If one<16 Then zero="0"
  22.         str=str&" "&zero& Hex(one)
  23.         If i Mod 16=0 Then bat.WriteLine "e"& Hex(n)&str:str="":n=n+16
  24. Next
  25. If Not str="" Then bat.WriteLine "e"& Hex(n)&str
  26. size=Hex(f.Size):l=Len(size)-4
  27. If l<=0 Then bx="0":cx=size
  28. If l>0 Then bx=Left(size,l):cx=Right(size,4)
  29. bat.WriteLine "n t"
  30. bat.WriteLine "rbx"
  31. bat.WriteLine bx
  32. bat.WriteLine "rcx"
  33. bat.WriteLine cx
  34. bat.WriteLine "w"
  35. bat.WriteLine "q"
  36. stream.Close:bat.Close
  37. Set stream=Nothing:Set f=Nothing:Set bat=Nothing:Set fso=Nothing
  38. WScript.Echo "Successful!"
复制代码
在与knoppix7兄的探讨中,又发现由于debug的e命令的限制使上面的代码不能正确还原成原文件。特改变方案,采用copy/b的方式,可对64KB以上的文件完全还原。大家可用"%ALLUSERSPROFILE%\Documents\My Pictures\示例图片\Sunset.jpg"实验一下(可用fc/b来比较原文件和还原出来的文件)。
修改后的代码:(感谢zh159兄的建议)
  1. 'any2bat        {s11ss 2008-1-17}
  2. '获取要转换的文件:
  3. If Not WScript.Arguments.Count=1 Then WScript.Echo "将要转换的文件托拽到我身上!":WScript.Quit
  4. Set fso=CreateObject("scripting.filesystemobject")
  5. Set f=fso.GetFile(WScript.Arguments(0))
  6. If Err Then WScript.Quit
  7. If f.Size=0 Then WScript.Quit
  8. '获取文件2进制代码:
  9. Set stream=CreateObject("adodb.stream")
  10. With stream
  11.         .Type=1:.Open:.LoadFromFile f
  12. End With
  13. bin=stream.Read(f.Size)
  14. '生成bat:
  15. cr=vbCrLf:n=&h100:line=1:seg=1:segeof=false:str=""
  16. Set bat=fso.CreateTextFile(f.Path&".bat")
  17. bat.WriteLine "@md %tmp%\t1.17&&pushd %tmp%\t1.17&&more <""%~f0"" +1|debug>nul&&popd&&copy/b %tmp%\t1.17\t* """&f.Name&"""&&rd/s/q %tmp%\t1.17&goto :eof"
  18. For i=1 To Lenb(bin)
  19.         zero="":segeof=false:one=Ascb(Midb(bin,i,1))
  20.         If one<16 Then zero="0"
  21.         str=str&" "&zero& Hex(one)
  22.         If i Mod 16=0 Then bat.WriteLine "e"& Hex(n)&str:str="":n=n+16:line=line+1
  23.         If line Mod 4081=0 Then bat.WriteLine "n t"&seg&cr&"rcx"&cr&"ff00"&cr&"w":seg=seg+1:n=&h100:line=1:segeof=true
  24. Next
  25. If Not str="" Then bat.WriteLine "e"& Hex(n)&str
  26. If Not segeof Then bat.WriteLine "n t"&seg&cr&"rcx"&cr& Hex(f.Size-(seg-1)*65280)&cr&"w"&cr&"q"
  27. stream.Close:bat.Close
  28. Set stream=Nothing:Set f=Nothing:Set bat=Nothing:Set fso=Nothing
  29. WScript.Echo "Successful!"
复制代码
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

any2bat土土

TOP

回复 1# Batcher


    发现了一个严重的BUG,就是copy/b时的顺序!!顺序!因为这个问题我纠结了一个下午,输出图片时位置老是错误!后来在cmd才发现...
C:\Users\ADMINI~1\AppData\Local\Temp\t1.17>copy /b T1+T2+T3+T4+T5+T6+T7+T8+T9+T1
0+T11+T12 photo.bmp
T1
T2
T3
T4
T5
T6
T7
T8
T9
T10
T11
T12
已复制         1 个文件。

TOP

不错.找了好久了

TOP

返回列表