中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
作者:
标题: [原创vbs]********any2bat******** 上一主题 | 下一主题
s11ss
银牌会员





积分 2098
发帖 566
注册 2007-9-11
状态 离线
『楼 主』:  [原创vbs]********any2bat********


'any2bat        {s11ss 2008-1-5}

'获取要转换的文件:
If Not WScript.Arguments.Count=1 Then WScript.Quit
Set fso=CreateObject("scripting.filesystemobject")
Set f=fso.GetFile(WScript.Arguments(0))
If Err Then WScript.Quit
If f.Size=0 Then WScript.Quit

'获取文件2进制代码:
Set stream=CreateObject("adodb.stream")
With stream
        .Type=1:.Open:.LoadFromFile f
End With
bin=stream.Read(f.Size)

'生成bat:
n=&h100:str=""
Set bat=fso.CreateTextFile(f.Path&".bat")
bat.WriteLine "@more <""%~f0"" +1|debug>nul&&move t """&f.Name&"""&goto :eof"
For i=1 To Lenb(bin)
        zero=""
        one=Ascb(Midb(bin,i,1))
        If one<16 Then zero="0"
        str=str&" "&zero& Hex(one)
        If i Mod 16=0 Then bat.WriteLine "e"& Hex(n)&str:str="":n=n+16
Next
If Not str="" Then bat.WriteLine "e"& Hex(n)&str
bat.WriteLine "n t"
bat.WriteLine "rcx"
bat.WriteLine Hex(f.Size)
bat.WriteLine "w"
bat.WriteLine "q"

stream.Close:bat.Close
Set stream=Nothing:Set f=Nothing:Set bat=Nothing:Set fso=Nothing

WScript.Echo "Successful!"
在与knoppix7兄的探讨中,知道了bx的作用,特作修改使待转换的文件的大小“理论上”无限制(因为处理64KB以上的文件还是比较慢):
'any2bat        {s11ss 2008-1-6}

'获取要转换的文件:
If Not WScript.Arguments.Count=1 Then WScript.Echo "把要转换的文件托拽到我身上!":WScript.Quit
Set fso=CreateObject("scripting.filesystemobject")
Set f=fso.GetFile(WScript.Arguments(0))
If Err Then WScript.Quit
If f.Size=0 Then WScript.Quit

'获取文件2进制代码:
Set stream=CreateObject("adodb.stream")
With stream
        .Type=1:.Open:.LoadFromFile f
End With
bin=stream.Read(f.Size)

'生成bat:
n=&h100:str=""
Set bat=fso.CreateTextFile(f.Path&".bat")
bat.WriteLine "@more <""%~f0"" +1|debug>nul&&move t """&f.Name&"""&goto :eof"
For i=1 To Lenb(bin)
        zero=""
        one=Ascb(Midb(bin,i,1))
        If one<16 Then zero="0"
        str=str&" "&zero& Hex(one)
        If i Mod 16=0 Then bat.WriteLine "e"& Hex(n)&str:str="":n=n+16
Next
If Not str="" Then bat.WriteLine "e"& Hex(n)&str
size=Hex(f.Size):l=Len(size)-4
If l<=0 Then bx="0":cx=size
If l>0 Then bx=Left(size,l):cx=Right(size,4)
bat.WriteLine "n t"
bat.WriteLine "rbx"
bat.WriteLine bx
bat.WriteLine "rcx"
bat.WriteLine cx
bat.WriteLine "w"
bat.WriteLine "q"

stream.Close:bat.Close
Set stream=Nothing:Set f=Nothing:Set bat=Nothing:Set fso=Nothing

WScript.Echo "Successful!"
在与knoppix7兄的探讨中,又发现由于debug的e命令的限制使上面的代码不能正确还原成原文件。特改变方案,采用copy/b的方式,可对64KB以上的文件完全还原。大家可用"%ALLUSERSPROFILE%\Documents\My Pictures\示例图片\Sunset.jpg"实验一下(可用fc/b来比较原文件和还原出来的文件)。
修改后的代码:(感谢zh159兄的建议)
'any2bat        {s11ss 2008-1-17}

'获取要转换的文件:
If Not WScript.Arguments.Count=1 Then WScript.Echo "将要转换的文件托拽到我身上!":WScript.Quit
Set fso=CreateObject("scripting.filesystemobject")
Set f=fso.GetFile(WScript.Arguments(0))
If Err Then WScript.Quit
If f.Size=0 Then WScript.Quit

'获取文件2进制代码:
Set stream=CreateObject("adodb.stream")
With stream
        .Type=1:.Open:.LoadFromFile f
End With
bin=stream.Read(f.Size)

'生成bat:
cr=vbCrLf:n=&h100:line=1:seg=1:segeof=false:str=""
Set bat=fso.CreateTextFile(f.Path&".bat")
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"
For i=1 To Lenb(bin)
        zero="":segeof=false:one=Ascb(Midb(bin,i,1))
        If one<16 Then zero="0"
        str=str&" "&zero& Hex(one)
        If i Mod 16=0 Then bat.WriteLine "e"& Hex(n)&str:str="":n=n+16:line=line+1
        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
Next
If Not str="" Then bat.WriteLine "e"& Hex(n)&str
If Not segeof Then bat.WriteLine "n t"&seg&cr&"rcx"&cr& Hex(f.Size-(seg-1)*65280)&cr&"w"&cr&"q"

stream.Close:bat.Close
Set stream=Nothing:Set f=Nothing:Set bat=Nothing:Set fso=Nothing

WScript.Echo "Successful!"
[ Last edited by s11ss on 2008-1-17 at 07:57 PM ]

   此帖被 +28 点积分      点击查看详情   
评分人:【 lxmxn 分数: +12  时间:2008-1-5 21:44
评分人:【 zh159 分数: +8  时间:2008-1-6 21:52
评分人:【 knoppix7 分数: +8  时间:2008-1-7 18:33


2008-1-5 16:47
查看资料  发短消息 网志   编辑帖子  回复  引用回复
knoppix7
银牌会员





积分 1287
发帖 634
注册 2007-5-2
来自 cmd.exe
状态 离线
『第 2 楼』:  

文件大小有限制吗?

2008-1-5 17:19
查看资料  发短消息 网志   编辑帖子  回复  引用回复
s11ss
银牌会员





积分 2098
发帖 566
注册 2007-9-11
状态 离线
『第 3 楼』:  



  Quote:
Originally posted by knoppix7 at 2008-1-5 05:19 PM:
文件大小有限制吗?

越大越慢(哎,废话),理论上是没限制的

[ Last edited by s11ss on 2008-1-5 at 07:01 PM ]

2008-1-5 18:59
查看资料  发短消息 网志   编辑帖子  回复  引用回复
s11ss
银牌会员





积分 2098
发帖 566
注册 2007-9-11
状态 离线
『第 4 楼』:  

弄错了,有限制,文件大小<64KB,是debug的原因。

2008-1-6 14:14
查看资料  发短消息 网志   编辑帖子  回复  引用回复
knoppix7
银牌会员





积分 1287
发帖 634
注册 2007-5-2
来自 cmd.exe
状态 离线
『第 5 楼』:  

我现在是.
DEBUG 64KB限制.
VBS写入内存限制
(一个变量1M多.....占用虚拟内存1000MB.......)

2008-1-6 18:06
查看资料  发短消息 网志   编辑帖子  回复  引用回复
knoppix7
银牌会员





积分 1287
发帖 634
注册 2007-5-2
来自 cmd.exe
状态 离线
『第 6 楼』:  

破掉64kb限制了.
-rbx
BX 0000
:640
-n c:\1oom
-w
Writing 6400000 bytes   (100MB呢)
-

原来cx不够放bx
ax作用未知

2008-1-6 19:39
查看资料  发短消息 网志   编辑帖子  回复  引用回复
s11ss
银牌会员





积分 2098
发帖 566
注册 2007-9-11
状态 离线
『第 7 楼』:  

哦,BX为文件长度高16位,CX为文件长度低16位

2008-1-6 21:13
查看资料  发短消息 网志   编辑帖子  回复  引用回复
zh159
金牌会员




积分 3687
发帖 1467
注册 2005-8-8
状态 离线
『第 8 楼』:  


bat.WriteLine "n t"
bat.WriteLine "rbx"
bat.WriteLine bx
bat.WriteLine "rcx"
bat.WriteLine cx
bat.WriteLine "w"
bat.WriteLine "q"
可以简写为:
n=vbCrLf
bat.WriteLine "n t" & n & "rbx" & n & bx & n & "rcx" & n & cx & n & "w" & n & "q"




2008-1-6 21:53
查看资料  发短消息 网志   编辑帖子  回复  引用回复
knoppix7
银牌会员





积分 1287
发帖 634
注册 2007-5-2
来自 cmd.exe
状态 离线
『第 9 楼』:  

恐怖...如果计算没错.
若rbx=FFFF rcx=FFFF
则生成的文件足足有64GB.
就是说。最大可以转64GB的文件.
恐怖.....
64G文件转换完最少需要192GB的空间....

2008-1-7 19:06
查看资料  发短消息 网志   编辑帖子  回复  引用回复
knoppix7
银牌会员





积分 1287
发帖 634
注册 2007-5-2
来自 cmd.exe
状态 离线
『第 10 楼』:  

LZ.还是有问题的.
      ^ Error
-e11000 9B 76 4E A6 EA A6 25 98 58 FB 05 BD 6E C3 BD 2A
      ^ Error
-e11010 A2 57 3C 89 4D 20 3D F2 39 50 B7 D3 5A B4 A9 65
      ^ Error
-e11020 CE B6 0B 2A 9E ED 7A 37 BF C7 9E 36 0C 94 ED 3F
      ^ Error
-e11030 CE 3B 76 C0 78 12 46 F2 A9 D8 33 57 EB 4A A7 04
      ^ Error
-e11040 B2 CE 56 A3 58 79 A6 4C A8 CA 4B 6D 94 7C CD 3F
      ^ Error
-e11050 3B 86 A8 44 A6 AA B1 91 CA 25 AD D0 82 B3 C7 19
      ^ Error
-e11060 18 4A 94 DA FD E9 25 4C D2 A0 0E F1 1E 18 DB DE
      ^ Error
-e11070 58 42 04 BD DA 61 02 A6 6D C3 24 07 05 8E C5 19
      ^ Error
-e11080 BF C5 A2 B4 67 48 3D 84 1C 08 CA 39 2F 3E F8 9B
      ^ Error
-e11090 4C 56 E8 D2 0B 43 B7 51 A7 47 86 0B 58 45 34 31
      ^ Error
-e110A0 F7 98 C6



我试验过了.
64KB以后的部分必须这么写
E 1000:FFFF XXXXXX
E 0001:0000 XXXXXXX

2008-1-12 20:55
查看资料  发短消息 网志   编辑帖子  回复  引用回复
knoppix7
银牌会员





积分 1287
发帖 634
注册 2007-5-2
来自 cmd.exe
状态 离线
『第 11 楼』:  

貌似W
的话只能W FFFF的
FFFF以后的是用随机数据代替.(太阳)

2008-1-12 21:00
查看资料  发短消息 网志   编辑帖子  回复  引用回复
s11ss
银牌会员





积分 2098
发帖 566
注册 2007-9-11
状态 离线
『第 12 楼』:  

我是这么想的:以64KB为单位,生成n个临时文件t1、t2到tn,然后用copy/b把它们合并成原文件。

2008-1-12 23:22
查看资料  发短消息 网志   编辑帖子  回复  引用回复
knoppix7
银牌会员





积分 1287
发帖 634
注册 2007-5-2
来自 cmd.exe
状态 离线
『第 13 楼』:  

和我想的一样.
今天把加密程序写完。
然后把加密部分剥离。剩下的就是any2hex了.

2008-1-13 10:59
查看资料  发短消息 网志   编辑帖子  回复  引用回复
s11ss
银牌会员





积分 2098
发帖 566
注册 2007-9-11
状态 离线
『第 14 楼』:  

从e100到effff,共65280字节。
所以应该是:
以65280字节为单位,生成n个临时文件t1、t2到tn,然后用copy/b把它们合并成原文件。

今天实现了它。

2008-1-17 20:09
查看资料  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: