中国DOS联盟

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

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

中国DOS联盟论坛
现在时间是 2026-08-06 17:52
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [原创]********Any2Bat******** 查看 770 回复 4
楼 主 [原创]********Any2Bat******** 发表于 2007-12-02 14:24 ·  中国 北京 电信
银牌会员
★★★
积分 2,098
发帖 566
注册 2007-09-11 07:27
18年会员
UID 97070
性别 男
状态 离线
@echo off

::::::::Any2Bat {s11ss 2007-12-2}::::::::

::思路:利用debug获得原文件16进制代码,然后再次利用debug构造生成原文件的bat代码。

setlocal

set f="%~f1"
if not exist %f% (echo File doesn't exist!&&goto :eof)

::写临时文件
set len=%~z1
set/a end=0x100+%len%-1
call :10to16 %end%
pushd %tmp%
>t1 call echo d100 %%r%end%%%
>>t1 echo q
>nul copy %f% t2
type t1|debug t2|more|find ":">t3

::读取临时文件t3,获得16进制代码
set "i= %%a %%b %%c %%d %%e %%f %%g %%h %%i %%j %%k %%l %%m %%n %%o %%p %%q"
for /f "delims=" %%a in (t3) do set/a lines+=1
set/a m=1
setlocal enabledelayedexpansion
for /f "tokens=1-17 delims=- " %%a in (t3) do (
if !m! equ %lines% goto :lastline
set "hex!m!=%i%"
set/a m+=1
)
:lastline
set/a m-=1
set/a remain=(%len%-16*%m%+1)*3
call set remain=%%i:~0,%remain%%%
for /f "tokens=1-17 delims=- " %%a in ('^<t3 more +%m%') do set "hex%lines%=%remain%"

::写bat
call :10to16 %len%
set t=^>^>%f%.bat echo
%t% @echo off
%t% ^<^"%%^~f0^" more +4 ^|debug ^>nul
%t% move t "%~nx1"
%t% goto :eof
for /l %%a in (1,1,%lines%) do (
call set hex%%a=%%hex%%a:*:=e%%
%t% !hex%%a!
)
%t% rcx
%t% !r%len%!
%t% n t
%t% w
%t% q

for /l %%a in (1,1,3) do (del t%%a)

goto :eof










:10to16
set "h=0123456789ABCDEF"
set/a q=%1
:1c
set/a r=%q%%%16
set/a q=%q%/16
call set r=%%h:~%r%,1%%
call set r%1=%r%%%r%1%%
if not %q% equ 0 goto :1c
2 发表于 2007-12-02 21:54 ·  中国 甘肃 兰州 电信
金牌会员
★★★★
积分 4,103
发帖 1,744
注册 2006-01-20 13:00
20年会员
UID 49241
性别 男
来自 甘肃.临泽
状态 离线
像这样的问题,我始终觉得 debug 不好,要是文件大了就慢的,http://www.cn-dos.net/forum/viewthread.php?tid=35808 还是用vbs快多了,不是打击s11ss兄,用最短的脚本最快的效率最合适的工具解决问题才是关键,至少我们现在学习这些脚本都是为了解决问题吧
3 发表于 2007-12-02 23:30 ·  中国 北京 鹏博士BGP
银牌会员
★★★
积分 2,098
发帖 566
注册 2007-09-11 07:27
18年会员
UID 97070
性别 男
状态 离线
Originally posted by vkill at 2007-12-2 09:54 PM:
像这样的问题,我始终觉得 debug 不好,要是文件大了就慢的,http://www.cn-dos.net/forum/viewthread.php?tid=35808 还是用vbs快多了,不是打击s11ss兄,用最 ...


我还要多谢vkill兄啊,vkill兄总是鞭策鼓励我不断的学习以得到进步——我发的帖子"Base64加密"里兄说不是纯P的,这回Any2Bat是纯P的兄又说debug不好。当然这两件事并不矛盾,我也丝毫没有埋怨兄的意思。各路大侠尽管批评指正!
4 发表于 2007-12-03 00:22 ·  中国 广西 玉林 博白县 电信
金牌会员
★★★★
积分 3,687
发帖 1,467
注册 2005-08-08 12:00
20年会员
UID 44210
状态 离线
我的意见是:比较简单的P应用(少量字符加密之类)尽量使用纯P;大量处理文字、文件转换,使用效率高的脚本(VBS等)
5 发表于 2007-12-03 10:48 ·  中国 上海 松江区 电信
铂金会员
★★★★
DOS一根葱
积分 5,493
发帖 2,315
注册 2006-05-01 10:41
20年会员
UID 54766
性别 男
来自 上海
状态 离线
s11ss兄的确很有创意,打击也好埋怨也好都不成立,就当自己练练自己的Batch功底吧,因为日常应用中Batch类型并不多,久而久之出现对某些命令陌生起来,同理机器不动会生锈,反之在在练Batch时积累更多的经验。

16进制转换我还是用C++启程者GOTOmsdos兄的迷你互转器效率超高
http://www.cn-dos.net/forum/viewthread.php?tid=21955&fpage=1&highlight=%2Bgotomsdos
第一高手 第二高手

论坛跳转: