中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 请强人解答doskey在批处理中的异常情况 (xp sp2)
作者:
标题: 请强人解答doskey在批处理中的异常情况 (xp sp2) 上一主题 | 下一主题
kcdsw
中级用户





积分 404
发帖 179
注册 2006-3-30
状态 离线
『楼 主』:  请强人解答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



2006-12-8 10:02
查看资料  发短消息 网志   编辑帖子  回复  引用回复
3742668
荣誉版主





积分 2013
发帖 718
注册 2006-2-18
状态 离线
『第 2 楼』:  

看书不认真的家伙。

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

-------摘自《帮助与支持》
在以前研究批处理加密时关注过此问题,变通的方法是修改注册表使cmd运行前执行宏命令,具体参考cmd /d详解。

2006-12-8 12:31
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
kcdsw
中级用户





积分 404
发帖 179
注册 2006-3-30
状态 离线
『第 3 楼』:  

呵呵  谢谢版主

我的机器上帮助是关闭的

我只看了/?

我想用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可用的话   那么只需要在 批处理语句前加' 就可以了

2006-12-9 06:23
查看资料  发短消息 网志   编辑帖子  回复  引用回复
3742668
荣誉版主





积分 2013
发帖 718
注册 2006-2-18
状态 离线
『第 4 楼』:  


: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的快得多。

2006-12-10 02:39
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
qzwqzw
银牌会员

天的白色影子


积分 2342
发帖 635
注册 2004-3-6
状态 离线
『第 5 楼』:  

关于 ' 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或前或后应该也无所谓,根据实际情况而定吧。

2006-12-10 05:09
查看资料  发短消息 网志   编辑帖子  回复  引用回复
lxmxn
版主




积分 11386
发帖 4938
注册 2006-7-23
状态 离线
『第 6 楼』:  


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


2006-12-10 07:06
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
3742668
荣誉版主





积分 2013
发帖 718
注册 2006-2-18
状态 离线
『第 7 楼』:  

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来调用而且对于出错也更容易处理。

2006-12-10 14:07
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
qzwqzw
银牌会员

天的白色影子


积分 2342
发帖 635
注册 2004-3-6
状态 离线
『第 8 楼』:  

嗯,看来是我的描述有问题……

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

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

第二,vbs与bat的效率问题

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

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

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

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

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

2006-12-10 15:34
查看资料  发短消息 网志   编辑帖子  回复  引用回复
3742668
荣誉版主





积分 2013
发帖 718
注册 2006-2-18
状态 离线
『第 9 楼』:  



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

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

2006-12-11 08:05
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: