BAT转换成EXE为什么某些代码会失效
发布网友
发布时间:2022-05-12 19:46
我来回答
共1个回答
热心网友
时间:2023-10-20 04:39
原BAT文件不能出现下列情况。不然会失效
1、每行只能执行一个命令,就是说不允许有"|"( 管道),
2、除了echo 或者 dir之外,其他情况不允许再有转向命令(>,>>)
如:type a.txt | find "abc" -->非法(不能有|)
再如:find "abc' a.txt >b.txt --->非法(不能有>)
再再如:外部命令dspt.exe 0 /l >d.txt --->非法(不能有>)
再再再如: for %%i in (%a%) do echo %%i >>c.txt ->非法(不能有>,>>)
再再再再如:if %a%==1 if %b%==2 set c=3 -->非法(不能连续执行)
3、call 命令不会返回参数
举例如下:
set a=123
call b.bat ------>b.bat中的命令为:set a=abc
echo %a%
对于bat方式,执行上述命令后,echo 的结果是:abc
这是我们最常用的bat命令调用,也就是说,bat传送变量。
但是,对于编译后的BAT文件,它执行的结果是:123 ------》 没错,还是123 !!
真的没错,这不是Bug,这是标准的com、exe执行方式,
其实,这个应该很好理解,这与一个exe程序不能直接向另一个exe程序传递参数一样。
例如,如果你的bat中用到wbat.com,其中有个w.bat,若编译后,w.bat所传递的参数将无效。
如果你知道什么是全局变量、局部变量,那你该一点就通,如果还不了解,可以看看有关方面的书,也可做以下试验:
执行以下命令,你就会明白:
set a=123
echo %a% ------->结果是:123,没错
command /k
set a=abc
echo %a% ------->显示:abc,也没错
exit
echo %a% -------》结果是什么,是123或是abc? 自己做吧
就是全局变量与局部变量的简单显示,当然,如果你的bat根本就没有call命令,那你是不会在意的。
极个别第三方软件在BAT编译后,运行不正常,人无完人,别太苛求,试验后确定吧,实在不行就Call。
4、BAT编译软件有两个严重的bug,必须避开它:
a、变量名,如bat中有:
set a=1
set ab=2
set abc=3
这三条命令在bat中执行正确,但编译软件会认为是一样的,会出错,这是一个BUG,只要避开它就可了:即变量名不要有完全重合。
b、echo set a=c:>a.txt
echo dir %%a%%>>a.txt
这两条命令在bat中执行正确,但在BAT编译后会在"c:"及%a%后面多出几个空格,
set a=c:变成了set a=c: ,会出现错误,这也是一个BUG,普通的文本输出没有问题,如有必要,也要避开它。