标题: [文本处理] [已解决]请问如何处理输入任意字符开始,并能返回字符值呢? [打印本页]
作者: amwfjhh 时间: 2014-11-17 15:05 标题: [已解决]请问如何处理输入任意字符开始,并能返回字符值呢?
本帖最后由 amwfjhh 于 2014-11-17 22:10 编辑
如题,比如pause能中断批处理,接受任意字符输入,但是得不到返回值,set/p能得到返回值,但它只接收以回车为结尾的字符串(即是说除空值以外,要接收来自键盘输入可见字符,至少得按两次键),
请问有没有办法将二者的优点集合起来,达到既能中断批处理,又可以将恢复中断的字符值存到一个变量里以供后续调用呢?
作者: CrLf 时间: 2014-11-17 21:00
本帖最后由 CrLf 于 2014-11-17 21:04 编辑
如果不用第三方的话,大概有这几种办法,各有缺点:
1、powershell:- powershell -c "([console]::readkey($true)).KeyChar"
复制代码
2、choice:- @echo off
- choice /c abc /n /cs
- if errorlevel 3 (echo 输入为 c
- )else if errorlevel 2 (echo 输入为 b
- )else if errorlevel 1 echo 输入为 a
- pause
复制代码
3、汇编中断:http://bbs.bathome.net/redirect. ... 4&fromuid=30406- @echo off
- echo,, P_0E30E50E75!!5!)-!TL-!>getch.com
- getch.com
- echo The char is ^%=ExitCodeAscii%
- pause
复制代码
所以还是建议用第三方
------------------------------------------------------
4、最佳方案...
突然想起来,plp 以前提到过联盟的一个 sc 方案,那么就不需要第三方了,修改如下:复制代码
或复制代码
作者: amwfjhh 时间: 2014-11-17 21:57
回复 2# CrLf
受教了。谢谢CrLf的回复。一个一个地学习一下。
作者: amwfjhh 时间: 2014-11-18 10:36
回复 2# CrLf
比较钟情于echo法与sc|findstr法,但是经实验,sc|findstr好像只能达到中断效果,没法获得输入字符啊?还是我没用对方法,回车 大大能给个sc|findstr的示例代码吗?
作者: amwfjhh 时间: 2014-11-18 17:35
汇编中断法,稍加改动:既然只需要获得字符,那都不需要返值给DOS,只需要把输入的字符显示出来即可,然后可以用FOR命令来设其值。- echo exit|cmd /k prompt e100 b4 01 cd 21 c3$_n getch.com$_rcx$_5$_w$_q|debug>nul
复制代码
这样生成一个字有5个字节的com程序,然后在FOR里设置之……- for /f %%i in ('getch.com') do set "input=%%i"
复制代码
作者: CrLf 时间: 2014-11-19 15:14
回复 5# amwfjhh
sc+findstr也同理啊- for /f "delims=" %%a in ('sc^|findstr /x .') do echo 您输入的是 %%a
复制代码
- for /f "delims=" %%a in ('sc^|findstr /x ¥') do echo 您输入的是 %%a
复制代码
作者: amwfjhh 时间: 2014-11-19 17:55
回复 6# CrLf
上面两句都试过,不能得到正确结果。
作者: CrLf 时间: 2014-11-19 20:30
试了下确实不行,不是 StdOut 和 StdErr 的输出,貌似只是键盘输入的回显...
作者: amwfjhh 时间: 2014-11-19 20:38
嗯,应该是回显被吃了
作者: CrLf 时间: 2014-11-19 20:47
回复 5# amwfjhh
16号中断的0号功能貌似也行,如果这样的话就只要三个字节了:复制代码
手头机子是 64位的,没法测试,你懂得
作者: amwfjhh 时间: 2014-11-19 20:52
回复 10# CrLf
我试试
作者: amwfjhh 时间: 2014-11-19 21:06
回复 10# CrLf
不行,只中断,不回显,不返值。
欢迎光临 批处理之家 (http://bathome.net./) |
Powered by Discuz! 7.2 |