Board logo

标题: 请强人解答doskey在批处理中的异常情况 (xp sp2) [打印本页]

作者: kcdsw     时间: 2006-12-8 10:02    标题: 请强人解答doskey在批处理中的异常情况 (xp sp2)

开始/运行/cmd

然后  doskey aa=pause 回车
然后  aa 回车
提示
请按任意键继续. . .
但是如果把
doskey aa=pause
aa
写入批处理 责会提示
'aa' 不是内部命令或外部命令云云....

望高手解释

  Quote:
http://www.cn-dos.net/forum/viewthread.php?tid=20940&fpage=1&highlight=doskey


作者: 3742668     时间: 2006-12-8 12:31
看书不认真的家伙。

  Quote:
运行 doskey 宏
要运行宏,请在命令行的开始位置键入宏名。如果使用 $* 或任何批处理参数 $1 到 $9 定义了宏,请使用空格来分隔参数。不能从批处理程序运行 doskey 宏

-------摘自《帮助与支持》
在以前研究批处理加密时关注过此问题,变通的方法是修改注册表使cmd运行前执行宏命令,具体参考cmd /d详解。
作者: kcdsw     时间: 2006-12-9 06:23
呵呵  谢谢版主

我的机器上帮助是关闭的

我只看了/?

我想用doskey 是因为那个vbs bat 混合编程
:On Error Resume Next
Sub bat
echo off & cls & doskey '=@

'echo bat & pause >nul
start wscript -e:vbs "%~f0"
Exit Sub
End Sub
MsgBox "vbs"
如果doskey可用的话   那么只需要在 批处理语句前加' 就可以了
作者: 3742668     时间: 2006-12-10 02:39

:On Error Resume Next
:       WScript.Echo "中国DOS联盟-批处理室"
:       WScript.Quit

' 2>nul & (@echo off & cls                )
' 2>nul & (    echo 中国DOS联盟-批处理室)
' 2>nul & (    pause>nul                )
' 2>nul & (exit /b 0                        )
建议尽量把bat部分写在vbs部分前面,因为vbs解释程序的效率要比bat的快得多。
作者: qzwqzw     时间: 2006-12-10 05:09
关于 ' 2>nul 存在一个漏洞:

如果存在一个可调用的程序名叫 ' ,会出现不可知的问题。
---------------------------

“vbs解释程序的效率要比bat的快得多”的结论,不知从何而来?

印象中,vbs与bat是一样的慢。

分别构造了两个带有万行注释的vbs和bat,之后都跟了一句(wscrip.)echo hello world

vbs采用的csript调用,bat 用call

结果,第一次vbs约2s多,bat则是1s多;之后vbs大约为0.4s,bat不变。
----------------------------

bat部分写在前面或后面会对程序效率造成影响吗?

对于wsh来说,bat不论写在前面或后面,wsh都会解析它,除非用 ' 做前缀。

而对cmd来说,bat写在前面就不需要进行标签重定位,中途直接exit/b或者goto:eof

bat写在后面,则需要跨越vbs段找到标签。

因此,bat写在前面的确会快一些,但那是因为cmd不必解析vbs段,而非vbs比bat快
-----------------------------------

另外还有个exit /b的问题:

印象中它与goto :eof的效率差不多,于是构造了个万行代码作测试。

结果goto :eof在第一次执行时稍快20ms,之后的差别就无法观测不到了。
--------------------------------------

突然觉得这种测试很无聊,有谁会去编写超过万行的脚本呢?

而脚本的效率问题主要体现在对海量数据的操作上,而非海量代码的解析上。

所以,bat或前或后应该也无所谓,根据实际情况而定吧。
作者: lxmxn     时间: 2006-12-10 07:06

  楼上的仁兄好强,研究这么透彻,拜一个……

作者: 3742668     时间: 2006-12-10 14:07
Re qzwqzw:

  1. 关于' 2>nul的问题:
        ' 2>nul不行可以用 ': 2>nul,'? 2>nul  ……
    ':? 2>nul & (@echo off & cls                )
    ':? 2>nul & (    echo 中国DOS联盟-批处理室)
    ':? 2>nul & (    pause>nul                )
    ':? 2>nul & (exit /b 0                        )

    : WScript.Echo "中国DOS联盟-批处理室"
    : WScript.Quit
    当然,即便是用上面的方法,如果有人用NtCreateFile来创建了命名特殊的可执行文件的话,还是可能出错。不过,4F的主题主要是就vbs和bat共存而例,而具体的实际意义并不大,就像加密bat一样,稍微了解就行了。如果硬要鸡蛋里面挑骨头的话,那么我们在XP中写的批处理在DOS下可能不能正常使用,我们是否就该放弃bat呢?
  2. 关于“vbs解释程序的效率要比bat的快得多”的问题:
        本句是针对bat混合vbs脚本的情况而言,如果不是此类情况相信也不会把它们做比较。关于你的测试结果,仅仅是“执行效率”的对比,并非“解释效率”。而且你测试的vbs前后时间的不同,也和vbs的运行机制有很大的关系,就像用for+dir遍历磁盘上所有文件与用wmi来遍历磁盘上所有的文件一样,第一次可能wmi需要很长的时间,可能会比for+dir慢(只是可能),但是第二次的遍历绝对要比for+dir快得多。不过这也并不能说明什么,只不过是for+dir与wmi的比较而已,并非vbs与bat的对比,如果专门就遍历文件写个专门优化的程序让bat调用,是否就是bat比vbs效率高呢?所以,vbs与bat的执行效率,并没有什么可比性,可比的只是某两个脚本的效率。Sorry,跑题了。
  3. bat部分写在前面或后面会对程序效率造成影响吗?
        你自己给出了答案,的确会快一些。而且这也是我在4F建议把bat部分写在前面的原因之一。而且从你的描述中正好可以得出。part 2的结论:vbs解释起来是要比bat快。
  4. 关于exit /b的问题:
        每个人有每个人的习惯,并没有谁说exit与goto孰好孰坏,我以前一直用goto :eof,只不过现在想改成用exit的习惯,因为exit /b可以设置errorlevel,虽然似乎并没有什么意义,But,“勿以善小而不为”,这样做主要是为了培养意识,以及在vbs编写中养成的习惯*
  5. "bat或前或后应该也无所谓,根据实际情况而定吧"
        如上面part 4 所说,培养意识而已,而且在原贴中也只是建议,并非说它是一个官方或者本论坛的标准。至于你的这句结案陈词,前面说无所谓,后面又根据实际情况而定,有自相矛盾的嫌疑。

*最初写vbs的时候,总是尽量写sub而不写成function,因为阴文基础差,function不大记得,后来对常用关键字比较了解以后,都是尽量把sub写成function,函数有返回值就写返回值,无则返回true或false,出错也可以直接返回false,这样不光在调用函数的时候可以直接用if function来调用而且对于出错也更容易处理。
作者: qzwqzw     时间: 2006-12-10 15:34
嗯,看来是我的描述有问题……

第一,你的 ' 2>nul 的修改虽然有漏洞,但可以被修复,所以可以作为改进方案,我对此十分乐见。

所谓“鸡蛋里挑些骨头”,只是希望在爱吃的鸡蛋里再找些爱吃的骨头罢了。

第二,vbs与bat的效率问题

因为测试的过程是解析+执行,所以结果也必然是解析+执行后的结果。

而我的两个测试脚本都是万行注释+一句echo代码,所以我的测试结果主要体现在解析上

第三,培养意识确实很重要,我很赞同,这与风格其实是相关的,有了意识就有了风格。

第四,结语很仓促,也很混沌,因为突然觉得自己的结果不重要,一种无味的心理在作怪。

我的意思是:仅从代码效率上来看,bat与vbs谁前谁后影响甚微乃至可以忽略,请依据其它的条件来决定它们的顺序。
作者: 3742668     时间: 2006-12-11 08:05


  Quote:
结语很仓促,也很混沌,因为突然觉得自己的结果不重要,一种无味的心理在作怪。

不错,结果的确不重要。对于vbs混合bat,我还是那个看法:了解即可,勿需深究。
不过若是你还是对 bat和vbs的效率对比 存在和我不同的看法不妨于站内消息系统留言我们一起探讨探讨,因为它已经超出了本主题的讨论范围了。而且为了一个无聊的话题来进行无谓肤浅(我们上面的讨论仅仅是着眼于表面,并未透过现象看本质)的讨论,未免落了下乘。