[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[其他] [讨论]批处理命令窗口闪一下就没了的原因

我只能总结出两个原因,各位批友怎么看?

批处理命令窗口闪一下就没了的原因:
1.如果没在行末加 pause,批处理默认以cmd /c的形式运行(运行完代码后不保存窗口——和其对应的是cmd /k命令),所以就会一闪就没了。
2.语法出错也会造成窗口一闪消失。(强调:语法错误!——对应的逻辑错误会得到错误结果,但是不会出现一闪而过——这也是cmd.exe的特性,像vbs这种功能比较强大的脚本就会提示语法错误的具体事项,而不会一闪而过)
例如:
for /l %%i in(1 1 10) do @Echo %%i
pause
::我的本意是要其输出1-10这十个数并暂停,但其却一闪而过了,这是因为 in(),in和()之间要空格!

好像有人讨论过。
一闪而过的原因是多样的:
1、没有使用pause、set /p、cmd /c、ping等具有暂停功能的命令,或者没有使用循环一类的命令,使得命令执行完毕之后自动退出。或者使用了含有中断、终止、退出等命令使得命令自动退出。
2、命令语法错误。常见的如刚才你提示的没有使用分隔符号分割命令(如空格),命令字母写错(如token=1),命令参数写错(如%a),等等,在for中这类错误比较敏感,发生错误直接退出。
3、命令对象错误也会导致命令发生错误退出。比如使用命令对一些文件进行操作,如果文件本身有错误,命令就无法正常执行。这种错误在start、if、for、findstr、del等中比较明显。
4、参数错误、变量错误等可预料和不可预料的错误。这个是十分经常地遇到的。我们以为按照代码执行后应该得到预想的结果,但执行后发现命令发生错误退出,使用echo和pause查找显示那些变量和参数,你就会发现一些蛛丝马迹了。这种错误在if命令中最常见,在for中往往难以发现。一般用echo来检查。另外,使用%0、call等命令参数下,在不同的情况下发生变化,而作者没有及时注意,导致发生错误而找不到原因。
5、执行环境干扰。有些杀毒软件或者病毒会禁止程序运行,甚至cmd执行也会被拦截。系统环境被破坏也同样影响到cmd的执行。比如有些系统没有findstr命令,则批处理出现该命令时就会发生错误。
6、程序完整性和执行条件改变导致程序无法执行。这些在别人写的程序中比较普遍,比如在D盘写的命令都能执行,但在桌面执行不了,或者在自己电脑可以执行,但换到其他电脑执行不了,或者在原来的程序中可以执行,但拷贝到自己程序中则无法执行。这就是程序的普遍适应性比较差,原因在于调试不够。桌面执行不了的原因是执行路径含有了空格,一般使用“%~dp0test.bat”的形式。在其他电脑执行不了的原因较多,基本的还是代码思路比较狭隘,可能性执行条件或排除故障的担忧不够多。在源代码中执行成功,复制到自己程序中失败一般会涉及到变量延迟、变量参数、路径等因素,而这些因素往往影响到批处理的稳定性。
7、符号错误、计算错误等局限性错误。至于符号造成的错误也是比较常见的,一个原因就是作者没有将符号错误的可能排除掉。而批处理在计算方面也是有极限的,如果不考虑这种情况发生错误也是正常的。所以,这些错误都需要进行排除和再加工。

综上,除了第一条常识原因和第五条外部原因,第二、第四、第七条是经常发生的、而且好多是因为我们的疏忽而造成的,第三、第五条是难以预料的发生的,第六条应该是可以预料的。
寂寞是黑白的,但黑白不是寂寞,是永恒。BAT 需要的不是可能,而是智慧。

TOP

个人理解:cmd 碰到 for 和 if 这两个关键词的时候,会按特定的语法对其后的内容进行预处理并载入内存,当“其后的内容”中缺失或者出现多余关键词和参数的时候,cmd 会出错退出,另外,当其后的语句无法构成合法语块的时候也会致错退出,这是其他命令所不具备的特性。

TOP

返回列表