当前位置: 首页 > 图文教程 > 脚本技术 > VBScript > 一个把任何文件转成批处理的vbs脚本Any2Bat.vbs

VBScript
vbs在网页中显示服务
vbs得没公开对象
unpack.vbs
使用批处理文件异地备份数据库(最近几天的数据)
VBScript 中的字节数据操作函数
切换dos并dir的vbs
杀毒的对vbs相当敏感 免杀
多进程的vbs脚本
Windows管理脚本学习
15分钟提醒一次,珍惜时间啊
从一个VBS脚本学习一点点东西
exe2swf 工具(Adodb.Stream版)
使用脚本自动修改ip设置
深入挖掘Windows脚本技术
用VBSCRIPT控制ONSUBMIT事件
VBS中Select CASE的其它用法
vbscript 可以按引用传递参数吗?
下载文件到本地运行的vbs
飘叶千夫指源代码,又称qq刷屏器
SendKeys参考文档

VBScript 中的 一个把任何文件转成批处理的vbs脚本Any2Bat.vbs


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-11   浏览: 50 ::
收藏到网摘: n/a

by [email protected]
用Base64编码数据,好处是压缩了大小(相对bin2str而言),缺点是增加处理时间和脚本复杂度。
由于效率瓶颈是在bat生成vbs这一步,所以总的来说还是合算了。
写文件用ADODB.Recordset,比debug好使多了。
大部分事都是脚本做的,批处理只是用echo来生成脚本而已。
echo版的好处是,全选复制粘贴到cmd shell里就把文件上传了。
复制代码 代码如下:

'Any2Bat.vbs by zzzEVAzzz
on error resume next
set arg=wscript.arguments
if arg.count=0 then wscript.quit
with CreateObject("ADODB.Stream")
.type=1:.open:.loadfromfile arg(0):bs=.read:l=.size:.close
end with
if err.number<>0 then wscript.quit
set fso=CreateObject("Scripting.FileSystemObject")
with fso.opentextfile(arg(0)&".bat",2,true)
if err.number<>0 then wscript.quit
.writeline "@echo bs=_>xx.vbs"
for k=1 to l step 129
.write "@echo """
.write b64b(midb(bs,k,129))
.writeline """+_>>xx.vbs"
next
.writeline "@echo """":set rs=CreateObject(""ADODB.Recordset"")>>xx.vbs"
.writeline "@echo set ado=CreateObject(""ADODB.Stream"")>>xx.vbs"
.writeline "@echo l=len(bs):ss="""":for k=1 to l step 4096:ss=ss+ub64(mid(bs,k,4096)):next:l=len(ss)>>xx.vbs"
.writeline "@echo rs.fields.append ""b"",205,l/2:rs.open:rs.addnew:rs(""b"")=ss+chrb(0):rs.update>>xx.vbs"
.writeline "@echo ado.mode=3:ado.type=1:ado.open:ado.write rs(""b"").getchunk(l/2)>>xx.vbs"
.writeline "@echo ado.savetofile """+fso.getfilename(arg(0))+""",2:ado.close>>xx.vbs"
.writeline "@echo function ub64(s):dim t(4),b(3):ub64="""":n=len(s):r=2 >>xx.vbs"
.writeline "@echo if n mod 4^<^>0 then exit function:end if:for i=1 to n step 4:for j=0 to 3 >>xx.vbs"
.writeline "@echo a=asc(mid(s,i+j,1)):if a=43 then:a=62:else if a=47 then:a=63:else if a^>47 and a^<58 then:_>>xx.vbs"
.writeline "@echo a=a+4:else if a=61 then:a=0:if r=2 then r=j-2:end if:else if a^>64 and a^<91 then:_>>xx.vbs"
.writeline "@echo a=a-65:else if a^>96 and a^<123 then:a=a-71:else:exit function:_>>xx.vbs"
.writeline "@echo end if:end if:end if:end if:end if:end if:t(j)=a:next>>xx.vbs"
.writeline "@echo b(0)=t(0)+t(1)*64 mod 256:b(1)=t(1)\4+t(2)*16 mod 256:b(2)=t(2)\16+t(3)*4 >>xx.vbs"
.writeline "@echo for j=0 to r:if b(j)^<16 then ub64=ub64+""0"":end if:ub64=ub64+hex(b(j))>>xx.vbs"
.writeline "@echo next:next:end function>>xx.vbs&&cscript.exe //nologo xx.vbs&del xx.vbs"
end with
const b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
function b64b(bin)
b64b=""
n=lenb(bin)
for i=1 to n step 3
a=ascb(midb(bin,i,1))
b64b=b64b+mid(b64,a mod 64+1,1)
if i<n then
b=ascb(midb(bin,i+1,1))
b64b=b64b+mid(b64,(a\64+b*4)mod 64+1,1)
if i+1<n then
c=ascb(midb(bin,i+2,1))
b64b=b64b+mid(b64,(b\16+c*16)mod 64+1,1)
b64b=b64b+mid(b64,c\4+1,1)
else
b64b=b64b+mid(b64,b\16+1,1)
b64b=b64b+"="
end if
else
b64b=b64b+mid(b64,a\64+1,1)
b64b=b64b+"=="
end if
next
end function

用法很简单,就一个参数——要转换的文件全路径。
也可以直接拖放文件到这个vbs的图标上。
"