Board logo

标题: [文本处理] [已解决]请问如何处理输入任意字符开始,并能返回字符值呢? [打印本页]

作者: 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:
  1. powershell -c "([console]::readkey($true)).KeyChar"
复制代码
2、choice:
  1. @echo off
  2. choice /c abc /n /cs
  3. if        errorlevel 3 (echo 输入为 c
  4. )else if errorlevel 2 (echo 输入为 b
  5. )else if errorlevel 1 echo 输入为 a
  6. pause
复制代码
3、汇编中断:http://bbs.bathome.net/redirect. ... 4&fromuid=30406
  1. @echo off
  2. echo,, P_0E30E50E75!!5!)-!TL-!>getch.com
  3. getch.com
  4. echo The char is ^%=ExitCodeAscii%
  5. pause
复制代码
所以还是建议用第三方
------------------------------------------------------
4、最佳方案...
突然想起来,plp 以前提到过联盟的一个 sc 方案,那么就不需要第三方了,修改如下:
  1. sc|findstr /x .
复制代码
  1. sc|findstr /v $
复制代码

作者: 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命令来设其值。
  1. echo exit|cmd /k prompt e100 b4 01 cd 21 c3$_n getch.com$_rcx$_5$_w$_q|debug>nul
复制代码
这样生成一个字有5个字节的com程序,然后在FOR里设置之……
  1. for /f %%i in ('getch.com') do set "input=%%i"
复制代码

作者: CrLf    时间: 2014-11-19 15:14

回复 5# amwfjhh


    sc+findstr也同理啊
  1. for /f "delims=" %%a in ('sc^|findstr /x .') do echo  您输入的是 %%a
复制代码
  1. 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号功能貌似也行,如果这样的话就只要三个字节了:
  1. int 16h
  2. ret
复制代码
手头机子是 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