'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&©/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 ]
