Board logo

标题: [特效代码] [已解决]重新启动后运行指定文件的批处理转换成exe后无法运行 [打印本页]

作者: waa333    时间: 2009-3-29 19:40     标题: [已解决]重新启动后运行指定文件的批处理转换成exe后无法运行

下面的代码是 重新启动后运行 test.txt 文件
在 bat 时可以正常运行,
将 bat 转换 为 exe 后 就无法运行了,
是不是下面的代码在 exe 中无法 使用,?还是能改改用?
  1. @echo Off
  2. Set "szFileExecuted=c:\Test.txt"
  3. Set "szStartup=%userProfile%\Start Menu\Programs\Startup\%~nx0"
  4. dir "%szStartup%">nul 2>nul && (Start "" "%szFileExecuted%") || (copy "%~f0" "%szStartup%") & del "%~f0"
复制代码

[ 本帖最后由 waa333 于 2009-11-21 11:00 编辑 ]
作者: zjw767676    时间: 2009-3-29 19:49

推荐你看看这个batcher写的教程,也许对你有帮助
  1. Bat2Com 成功密技教程
  2. 先说题外话,不喜或不同观点者勿怪:
  3. 1、说的是DOS,CMD可以不用看
  4. 2、在CN-DOS论坛上找到一个有关BAT加密的高楼大厦,一口气从1楼爬到350楼,试验一下,结果是:
  5.    大失所望,这些所谓的加密可说是自欺欺人,最简单的破解方法是先用RAR压缩,再用RAR查看,加密一目了然,所以奉劝各位,别再在BAT加密上浪费时间和精力了。
  6. 3、非要bat加密,只有bat2com。有人说了,bat2com将bat转换为COM或EXE的成功率很低,的确如此,我以前试过好几回,很少有成功的,那我还来这说什么?
  7.    稍别勿噪,我可以负责任的告诉你,bat2com真的很好很实用。
  8. 言归正传
  9. 一、转换不成功的原因分析
  10.    1、毫无疑问,bat2com肯定不是万能的,有一定的局限性,也有几个BUG,这是转换不成功的原因之一
  11.    2、你可能不太了解bat2com的处理规范,或你的BAT程序没有按bat2com的规范来编写,或者超出了bat2com的处理能力范围,这是转换不成功的最主要原因。
  12.      bat2com转换不成功的道理,与大多数CMD在dos下运行不成功的道理是一样的,只要你按dos规范来写CMD,那CMD就可以在dos下成功运行,废话:))
  13. 问题关键:是等bat2com的作者来修改、升级他的程序以适应你的BAT,还是修改你的BAT,让你的BAT适应bat2com的要求,成功还是失败,这是个问题。
  14. 二、bat2com的转换规范(以目前我手上的bat2com V1.5为例)
  15.     bat2com是按照bat的规范来处理的,对bat有很好的支持:
  16.     1、直接支持dos内部命令、外部命令,能带参数
  17.     2、直接支持IF、goto命令,支持GOTO的标号
  18.     3、忽略REM注解行
  19.     4、for命令是唯一的,直接以BAT方式执行。
  20.     5、每一行只执行唯一的一个命令,每个命令必须在一行中完成,即基本不支持|与>命令。
  21.     1-4 条与一般的bat要求是一致的,唯有第五条,是与常规bat的重大区别!!
  22. 三、基本要求,首先注意两点:
  23.    1、goto标号(:开头)不能重复,这比bat的要求严格。
  24.    2、保证你的BAT能在dos中以bat方式正确执行,这是前提条件,别以为这是废话。
  25.    
  26. 四、解读bat2com与BAT的重要区别
  27.   
  28.   (一)、最主要的一条:每一行只执行唯一的一个命令,每个命令必须在一行中完成,即基本不支持|与>命令
  29.     1、每行只能执行一个命令,就是说不允许有"|"( 管道),
  30.     2、除了echo 或者 dir之外,其他情况不允许再有转向命令(>,>>)
  31.        如:type a.txt | find "abc"                     -->非法(不能有|)
  32.        再如:find "abc' a.txt >b.txt                  --->非法(不能有>)
  33.        再再如:外部命令dspt.exe 0 /l >d.txt           --->非法(不能有>)
  34.        再再再如: for %%i in (%a%) do echo %%i >>c.txt  ->非法(不能有>,>>)
  35.        再再再再如:if %a%==1 if %b%==2 set c=3         -->非法(不能连续执行)
  36.    
  37.       我敢打赌,所谓BAT2com成功率低,绝大数的bat就因为这一条!
  38.       如果你的BAT中已经没有了上述类似文本,我相信,你的bat2com已经成功了90%。
  39.       怎么样,有点眉目了吧,别急,还没完呢
  40.    
  41.   (二)call 命令不会返回参数
  42.       举例如下:
  43.            set a=123
  44.            call b.bat  ------>b.bat中的命令为:set a=abc
  45.            echo %a%
  46.        对于bat方式,执行上述命令后,echo 的结果是:abc
  47.        这是我们最常用的bat命令调用,也就是说,bat传送变量。
  48.        但是,对于bat2com,它执行的结果是:123  ------》 没错,还是123 !!
  49.        真的没错,这不是Bat2com的Bug,也不是bat的bug,这是标准的com、exe执行方式,
  50.        其实,这个应该很好理解,这与一个exe程序不能直接向另一个exe程序传递参数一样。
  51.        例如,如果你的bat中用到wbat.com,其中有个w.bat,若bat2com后,w.bat所传递的参数将无效。
  52.         如果你知道什么是全局变量、局部变量,那你该一点就通,如果还不了解,可以看看有关方面的书,也可做以下试验:
  53.         执行以下命令,你就会明白:
  54.             set a=123
  55.             echo %a%         ------->结果是:123,没错
  56.             command /k
  57.             set a=abc
  58.             echo %a%         ------->显示:abc,也没错
  59.             exit
  60.             echo %a%         -------》结果是什么,是123或是abc? 自己做吧
  61.        就是全局变量与局部变量的简单显示,当然,如果你的bat根本就没有call命令,那你是不会在意的。
  62.      
  63.    (三)极个别第三方软件bat2com后,运行不正常,人无完人,别太苛求,试验后确定吧,实在不行就Call。
  64. 五、bat2com有两个严重的bug,必须避开它:
  65.     1、变量名,如bat中有:
  66.         set a=1
  67.         set ab=2
  68.         set abc=3
  69.       这三条命令在bat中执行正确,但BAT2com中会认为是一样的,会出错,这是一个BUG,只要避开它就可了:即变量名不要有完全重合。
  70.    
  71.     2、echo set a=c:>a.txt
  72.        echo dir %%a%%>>a.txt
  73.      这两条命令在bat中执行正确,但在bat2com中会在"c:"及%a%后面多出几个空格,
  74.      set a=c:变成了set a=c:      ,会出现错误,这也是一个BUG,普通的文本输出没有问题,如有必要,也要避开它。
  75. 六、解决的办法推荐
  76.     如果你按照上述要求重新修改你的BAT程序,bat2com成功,将近在眼前!
  77.     1、通过call 调用子程序BAT,执行|或>命令
  78.     你肯定会说,我的程序一定要有如:type a.txt | find "abc" 或 dspt.exe 0 /l >d.txt 或echo set a=c:>a.txt
  79.     很简单啊,将它做子程序bat,通过call调用,记住,子程序不能再bat2com!
  80.     2、子程序的参数不能通过set命令传递给bat2com,可能过文件方式,如
  81.         echo %你的参数% >a.txt
  82.       然后再在主程序读取a.txt的内容作为参数即可,这也是exe文件之间传递参数的标准方式。
  83. 七、隆重推荐:strings.com
  84.     有关trings.com的下载及介绍,论坛上很多,请自行搜索。
  85.     我只想说,strings是dos-bat的最佳搭档,有了strings,几乎可以完成bat所想完成的任何操作,如果没有strings,我肯定不会写这编文章的。
  86.     如echo echo 123>b.txt >a.bat,或echo type a.txt | find "abc" >a.bat
  87.     想在bat成功执行上述,得到正确的a.bat,是很难的(通过prompt变通,可以,但比较复杂),在bat2com中是绝对不可能的,但是,strings却能轻易做到!
  88.    strings的write命令,可以完善代替echo,而且对于>|等echo不认的符号,解决的非常好,如:
  89.    strings write a.bat,strings vhao=char 62    --》 set vhao=>
  90.    strings write a.bat, echo 123%%vhao%%b.txt  --》 echo echo 123>b.txt >a.bat
  91.    其中Vhao为>,可以任意定义为|等,运行a.bat即可得b.txt
  92.    
  93.    处理call返回的参数,变量运算、分析处理等等,strings都能轻松做到。
  94.    strings功能还很多,所以我推荐。
  95. 八、补充:
  96.     1、建议在dos环境中进行bat2com
  97.     2、任何bat2com之前,必须确保bat文件能正确运行
  98.     3、com文件不得大于64KB!
  99.     4、bat2com能正确执行后,再执行com2exe,将文件转换为exe。
  100. 九、附言:
  101.     为了数据安全,我一直想找个bat加密或2com的方法,如前所述,几经失望,后来想自己弄个for dos程序,但有近1n年没玩c++了,头痛,后来找到bat2com的原程序,仔细一看,正中下怀,逐步明白以前转换不成功的原因所在,经过n次测试,终于成功bat2com。
  102.     如果bat2com的作者能看到此文,最好能修正BUG、升级bat2com,或者等我哪天有空了,重操C++,邦他完善一下。
  103.     衷心感谢bat2com的作者(不能确定是否董占山)、strings的作者、strings帮助中文翻译(cn-dos的insert)、以及中国DOS联盟的热心的DOS高手!
  104.    
  105. 好了,这是本人经过N次测试得出的经验,难免错漏之处,欢迎补充、完善、指正。
  106.            欢迎交流,歌理 QQ107660899      2008.12.02
复制代码

作者: waa333    时间: 2009-3-29 19:59

回复 2 楼

我用  BATfoEXE  没有用你说的

bat2com  和com2exe
作者: zjw767676    时间: 2009-3-29 20:09     标题: 回复 3楼 的帖子

个人认为道理是一样的!
作者: waa333    时间: 2009-3-29 21:28

4 楼的朋友
帮忙把上面的代码改改,看看哪里出错?
能在exe里面用
不懂用你的bat2com和com2exe
作者: Batcher    时间: 2009-3-29 22:28

试试别的转换软件吧:

批处理潜行者5.0bat转exehttp://bbs.bathome.net/thread-1050-1-1.html
Quick BFC3.1.5bat转exehttp://bbs.bathome.net/thread-632-1-1.html
ExeScript
3.0bat转exehttp://bbs.bathome.net/thread-3261-1-1.html

作者: more    时间: 2009-3-30 11:19

因为转为exe后,bat文件被释放到临时文件夹下,文件名是随机的,运行的时候会运行临时文件夹下的bat,而重启后会因为找不到原文件而出错,我也碰到过类似的问题,所以我现在已经不转exe了,用第三方工具来隐藏cmd窗口比较好,我用的是cmdow
作者: waa333    时间: 2009-3-30 11:25

如何使用?
作者: more    时间: 2009-3-30 14:22

原帖由 waa333 于 2009-3-30 11:25 发表
如何使用?

其实cmdow /?会有详细说明的,隐藏窗口的参数是/hid,下面举个例子吧:
  1. @echo off
  2. title waa
  3. ping -n 2 127.1>nul%这里如果不延时有时会因为cmdow没有那么快的检测到title而出错%
  4. cmdow waa /hid
  5. rem 以下是代码
  6. ......
复制代码





欢迎光临 批处理之家 (http://bathome.net./) Powered by Discuz! 7.2