|
chujiafu
银牌会员
积分 1329
发帖 591
注册 2004-5-26 来自 安徽 宿州
状态 离线
|
『楼 主』:
如何在按回车后执行某些脚本?
如题。
类似这样的:
如果按了回车键,执行A脚本;如果按了其它键则执行B脚本(CMD环境,不想用Choice之类的,也不想用Y/N,回车多方便呀。)
A脚本
……
B脚本
……
[ Last edited by chujiafu on 2007-1-27 at 11:11 PM ]
|
|
2007-1-27 08:43 |
|
|
redtek
金牌会员
积分 2902
发帖 1147
注册 2006-9-21
状态 离线
|
『第
2 楼』:
真奇怪,哈哈……
按回车键执行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,回车多方便呀。)” 的问题不象要解决什么问题,象是在出考题,哈哈……干脆贴段原理实在头疼长长的代码~:)
此帖被 +4 点积分 点击查看详情 评分人:【 lxmxn 】 | 分数: +4 | 时间:2007-1-28 11:20 |
|
|
Redtek,一个永远在网上流浪的人……
_.,-*~'`^`'~*-,.__.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._ |
|
2007-1-27 10:46 |
|
|
chujiafu
银牌会员
积分 1329
发帖 591
注册 2004-5-26 来自 安徽 宿州
状态 离线
|
『第
3 楼』:
是这样的:如果按了回车键,执行A脚本;如果按了其它键,则执行B脚本。
|
|
2007-1-27 23:10 |
|
|
TLang
初级用户
Alpha
积分 46
发帖 21
注册 2007-1-27
状态 离线
|
『第
4 楼』:
但是我们所用的 用来输入的语句 都是以回车作为结束标记的
|
Impossible's Nothing! |
|
2007-1-27 23:30 |
|
|
zh159
金牌会员
积分 3687
发帖 1467
注册 2005-8-8
状态 离线
|
『第
5 楼』:
好像目前除了Choice(2003的支持中文)之类的第三方工具,单纯批处理没办法做出这样的响应
|
|
2007-1-27 23:41 |
|
|
chujiafu
银牌会员
积分 1329
发帖 591
注册 2004-5-26 来自 安徽 宿州
状态 离线
|
『第
6 楼』:
我的意思是:不用输入任何语句或字符,直接按回车,就执行A脚本;按了其它键就执行B脚本。
|
|
2007-1-27 23:53 |
|
|
redtek
金牌会员
积分 2902
发帖 1147
注册 2006-9-21
状态 离线
|
『第
7 楼』:
) n秒后不按任何键或是按某个键可以判断出用户的选择,使用2楼原理。
) 不生成临时文件、不使用 Choice、不使用 Set /p var=...达到代替 Choice和判断键值的方法如下:
@echo off && setlocal && cls
chcp 437 >nul
graftabl 936 >nul
set /p=请选择 [ 回车键 --- 执行A 其它键 --- 执行B ]:<nul
echo exit|cmd/kprompt $_e 100 CD 16 B4 4C CD 21$_g$_|debug>nul
echo.&echo.&echo.
if [%errorlevel%]==[13] ( goto :A ) else ( goto :B )
:A
:: 按回车符到这里执行
echo 这里是标签: A
goto :End
:B
:: 按其它键到这里执行
echo 这里是标签: B
goto :End
:End
:: 用于测试键值的代码段
:: 如果希望代替Choice外部命令,则这个代码段可以测试出不同的键值交由%ErrorLevel%判断
echo 所输入的ASCII码键值: %errorlevel%
Pause 每次所按的键值都在 %errorlevel% 变量中,可以使用 IF 语句来判断用户所按键值,再根据键值做更复杂的处理。
键值: 回车键 13
ESC键 27
更多的ASCII码表在论坛搜索中可找到~:)
ascii码大全——(0~255)已更新http://www.cn-dos.net/forum/view ... amp;highlight=ASCII
[原创]CMD批处理获取文件的ASCII码
http://www.cn-dos.net/forum/view ... amp;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 ]
此帖被 +4 点积分 点击查看详情 评分人:【 0401 】 | 分数: +4 | 时间:2007-1-28 13:23 |
|
|
Redtek,一个永远在网上流浪的人……
_.,-*~'`^`'~*-,.__.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._ |
|
2007-1-27 23:58 |
|
|
zh159
金牌会员
积分 3687
发帖 1467
注册 2005-8-8
状态 离线
|
『第
8 楼』:
关键是:如果不用Choice之类的第三方工具,如何确定按其他键后为结束?!批处理是以回车作为结束标记的
可以变为:不用输入任何语句或字符,直接按回车,就执行A脚本;按了其它键再按回车就执行B脚本。
这样可以用set /p执行
楼上的用debug不错
[ Last edited by zh159 on 2007-1-27 at 11:01 AM ]
|
|
2007-1-27 23:59 |
|
|
chujiafu
银牌会员
积分 1329
发帖 591
注册 2004-5-26 来自 安徽 宿州
状态 离线
|
『第
9 楼』:
Quote: | Originally posted by redtek at 2007-1-27 11:58 PM:
) n秒后不按任何键或是按某个键可以判断出用户的选择,使用2楼原理。
) 不生成临时文件、不使用 Choice、不使用 Set /p var=...达到代替 Cho ... |
|
试了一下您的脚本,第一遍太快了,看不清就一闪而过了,再试几遍时,里面的是乱码。不知何故?
|
|
2007-1-28 00:13 |
|
|
redtek
金牌会员
积分 2902
发帖 1147
注册 2006-9-21
状态 离线
|
『第
10 楼』:
不好意思,我忘了在最后一句加 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 ]
|
Redtek,一个永远在网上流浪的人……
_.,-*~'`^`'~*-,.__.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._ |
|
2007-1-28 00:20 |
|
|
chujiafu
银牌会员
积分 1329
发帖 591
注册 2004-5-26 来自 安徽 宿州
状态 离线
|
『第
11 楼』:
我自己在最后加了一个Pause>nul语句。但还有这个问题:第一遍可以,以后几遍就是乱码,而且不能显示中文,过几分钟之后再试,又可以了。
[ Last edited by chujiafu on 2007-1-28 at 12:42 AM ]
|
|
2007-1-28 00:33 |
|
|
chujiafu
银牌会员
积分 1329
发帖 591
注册 2004-5-26 来自 安徽 宿州
状态 离线
|
『第
12 楼』:
Re:RedTek兄
我把你的7楼脚本中的第二行前面的“Chcp 437|”这几个字符去掉了,就能显示中文了,而且每次都是中文。我试了几次,发现也可以正常使用。去掉之后有没有影响呀?
|
|
2007-1-28 00:50 |
|
|
redtek
金牌会员
积分 2902
发帖 1147
注册 2006-9-21
状态 离线
|
『第
13 楼』:
多谢chujiafu兄~:)))
如果原代码页 chcp 测试是437,那么graftabl 936就可以正常显示中文了:)
或是因为第一次运行了16位程序(如Debug),其当前代码页被系统切换为437,那么再运行graftabl 936时将可以正常显示中文:)
[ Last edited by redtek on 2007-1-27 at 12:02 PM ]
|
Redtek,一个永远在网上流浪的人……
_.,-*~'`^`'~*-,.__.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._ |
|
2007-1-28 00:57 |
|
|
chujiafu
银牌会员
积分 1329
发帖 591
注册 2004-5-26 来自 安徽 宿州
状态 离线
|
『第
14 楼』:
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 ]
|
|
2007-1-28 04:13 |
|
|
ualy
新手上路
积分 4
发帖 2
注册 2006-3-4
状态 离线
|
|
2007-1-28 09:59 |
|