中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --
联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟
中国DOS联盟论坛
现在时间是 2026-08-24 19:26
47,812 主题排行 / 349,910 发帖 / 今日 1 篇 / 48,262 会员排行
DOS批处理 & 脚本技术(批处理室) » 如何在按回车后执行某些脚本?
可打印版本  2,772 / 16
第1楼 chujiafu 发表于 2007-01-27 08:43
银牌会员 发帖 595 积分 1,339 来自 安徽 宿州
如何在按回车后执行某些脚本?
如题。

类似这样的:

如果按了回车键,执行A脚本;如果按了其它键则执行B脚本(CMD环境,不想用Choice之类的,也不想用Y/N,回车多方便呀。)

A脚本
……

B脚本
……

[ Last edited by chujiafu on 2007-1-27 at 11:11 PM ]
第2楼 redtek 发表于 2007-01-27 10:46
金牌会员 发帖 1,147 积分 2,902
真奇怪,哈哈……
按回车键执行A脚本,不按回车键就执行B,这好象是自相矛盾~:)
除非过n秒如果不按任何键,则自动执行B,这样才逻辑通过~:)

原理:

) A主批处理文件:

  在A主批处理文件中 START 出一个新窗口,递归调用自己通过%1来判断是递归加载参数。

  然后被START出的新批处理窗口我们叫它脚本B。

  在脚本B中使用 Title 设置窗口标题(为了是杀掉它方便)。
  在脚本B中 set /p var=接收用户键盘输入,如果输入回车键,则在脚本B中采用 exit 返回码 方式来通知这个批处理是正常接收了键盘输入的情况下退出的。

  假如在START出的脚本B中客户就成心不打任何键,也没关系。

  在主脚本A中START出这个窗口以后的下一句可是一个延时命令,如果延时10秒钟以后,就杀掉窗口B,不管窗口B是否正常退出,只要判断 %errorlevel% 就知道脚本B是否返回了一个约定码。

  然后如果脚本B返回的 %errorlevel% 为约定码,则脚本B是自然收到客户输入才正常退出的,所以执行主代码段A内的标签A。

  (因为如果脚本B是在正常的约定时间,如10秒内输入的回车,则正常退出不可能被杀,所以杀的时候找不到进程到个>nul就行了)

  如果脚本B在接收客户输入时,客户成心就是不输入任何键,则脚本B必然被脚本A杀掉,所以根本返回不了约定的返回码。

  所以 if %error% ……就知道了客户什么也没输入,所以执行A主批处理中的标签B。


) 以上是实现原理。

  但兄 “如果按了回车键,执行A脚本,否则执行B脚本(CMD环境,不想用Choice之类的,也不想用Y/N,回车多方便呀。)” 的问题不象要解决什么问题,象是在出考题,哈哈……干脆贴段原理实在头疼长长的代码~:)
第3楼 chujiafu 发表于 2007-01-27 23:10
银牌会员 发帖 595 积分 1,339 来自 安徽 宿州
是这样的:如果按了回车键,执行A脚本;如果按了其它键,则执行B脚本。
第4楼 TLang 发表于 2007-01-27 23:30
初级用户 发帖 21 积分 46
但是我们所用的 用来输入的语句 都是以回车作为结束标记的
第5楼 zh159 发表于 2007-01-27 23:41
金牌会员 发帖 1,467 积分 3,687
好像目前除了Choice(2003的支持中文)之类的第三方工具,单纯批处理没办法做出这样的响应
第6楼 chujiafu 发表于 2007-01-27 23:53
银牌会员 发帖 595 积分 1,339 来自 安徽 宿州
我的意思是:不用输入任何语句或字符,直接按回车,就执行A脚本;按了其它键就执行B脚本。
第7楼 redtek 发表于 2007-01-27 23:58
金牌会员 发帖 1,147 积分 2,902
) n秒后不按任何键或是按某个键可以判断出用户的选择,使用2楼原理。


) 不生成临时文件、不使用 Choice、不使用 Set /p var=...达到代替 Choice和判断键值的方法如下:





每次所按的键值都在 %errorlevel% 变量中,可以使用 IF 语句来判断用户所按键值,再根据键值做更复杂的处理。



键值: 回车键  13
    ESC键   27


更多的ASCII码表在论坛搜索中可找到~:)

ascii码大全——(0~255)已更新http://www.cn-dos.net/forum/viewthread.php?tid=25050&fpage=1&highlight=ASCII


CMD批处理获取文件的ASCII码
http://www.cn-dos.net/forum/viewthread.php?tid=26521&fpage=1&highlight=ASCII








上面实现原理: 调用 Debug 但不生成临时文件写入汇编代码。

        int 16 ; 调用键盘中断
        mov ah,4c
        int 21    ; 带参数(用户所按键值在 AL 寄存器中)返回DOS
               ; 把用户所按键值返回给 %errorlevel%

然后由 if 判断 %errorlevel% 的不同取值决定程序走向:)








[本贴检索主题词: 判断键值 按键 CHOICE 代替CHOICE 任意键 ]

[相关知识点检索主题词: ASCII码 DEBUG 键盘中断]



[ Last edited by redtek on 2007-1-28 at 01:21 PM ]
第8楼 zh159 发表于 2007-01-27 23:59
金牌会员 发帖 1,467 积分 3,687
关键是:如果不用Choice之类的第三方工具,如何确定按其他键后为结束?!批处理是以回车作为结束标记的

可以变为:不用输入任何语句或字符,直接按回车,就执行A脚本;按了其它键再按回车就执行B脚本。
这样可以用set /p执行

楼上的用debug不错

[ Last edited by zh159 on 2007-1-27 at 11:01 AM ]
第9楼 chujiafu 发表于 2007-01-28 00:13
银牌会员 发帖 595 积分 1,339 来自 安徽 宿州
Originally posted by redtek at 2007-1-27 11:58 PM:
) n秒后不按任何键或是按某个键可以判断出用户的选择,使用2楼原理。


) 不生成临时文件、不使用 Choice、不使用 Set /p var=...达到代替 Cho ...


试了一下您的脚本,第一遍太快了,看不清就一闪而过了,再试几遍时,里面的是乱码。不知何故?
第10楼 redtek 发表于 2007-01-28 00:20
金牌会员 发帖 1,147 积分 2,902
不好意思,我忘了在最后一句加 Pause 暂停命令了,因为平时习惯先进入cmd再操作~:)



) chcp 437|graftabl 936>nul

  为了防止调用 Debug (16位程序)后无法再正常显示中文,所以调用了上面代码,是强制中文显示:)

  在 XP 与 Win2003 下面可以正常调用上面的命令。




) 已知问题

  在调用 Debug 时,在网吧的机器上(是网吧禁止了可能存在的危险工具);
  在有些日文版的机器上使用 echo exit|cmd/kprompt...操作时也会出错,由于个性化设置或其它路径等原因;
  或是极少见的情况某些精减版XP,未带有Debug.exe外部工具。
  在一些装有杀病毒软件的机器上有可能这种操作方式会让杀病毒软件拦截掉~:)
  在桌面双击方式运行一个批处理程序 和 先进入CMD后再运行一个批处理程序它们有着细微的差别,echo exit|cmd/k..在后者兼容较好。

[ Last edited by redtek on 2007-1-27 at 11:29 AM ]
第11楼 chujiafu 发表于 2007-01-28 00:33
银牌会员 发帖 595 积分 1,339 来自 安徽 宿州
我自己在最后加了一个Pause>nul语句。但还有这个问题:第一遍可以,以后几遍就是乱码,而且不能显示中文,过几分钟之后再试,又可以了。

[ Last edited by chujiafu on 2007-1-28 at 12:42 AM ]
第12楼 chujiafu 发表于 2007-01-28 00:50
银牌会员 发帖 595 积分 1,339 来自 安徽 宿州
Re:RedTek兄
我把你的7楼脚本中的第二行前面的“Chcp 437|”这几个字符去掉了,就能显示中文了,而且每次都是中文。我试了几次,发现也可以正常使用。去掉之后有没有影响呀?
第13楼 redtek 发表于 2007-01-28 00:57
金牌会员 发帖 1,147 积分 2,902
多谢chujiafu兄~:)))

如果原代码页 chcp 测试是437,那么graftabl 936就可以正常显示中文了:)

或是因为第一次运行了16位程序(如Debug),其当前代码页被系统切换为437,那么再运行graftabl 936时将可以正常显示中文:)

[ Last edited by redtek on 2007-1-27 at 12:02 PM ]
第14楼 chujiafu 发表于 2007-01-28 04:13
银牌会员 发帖 595 积分 1,339 来自 安徽 宿州
Re:RedTek兄
看了您发给我的PM,我把代码页的那一句改成了两行,就可以了。或者这样:echo q|debug>nul
graftabl 936 >nul也可以。但如果把这两句都去掉了,不能显示中文。
我的系统是:Winxp Sp1,中文版。

再次感谢RedTek兄。

[ Last edited by chujiafu on 2007-1-28 at 04:25 AM ]
第15楼 ualy 发表于 2007-01-28 09:59
新手上路 发帖 2 积分 4
au3可以实现
1 2  下一页
[ 联系联盟系统管理团队 - 中国DOS联盟 - 标准版 ]
Sponsored by ifanr Inc | © 2001–2023