Board logo

标题: [转]不需要choice.exe和回车就能获得按键输入的方法/黑科技 [打印本页]

作者: 523066680    时间: 2016-9-6 23:56     标题: [转]不需要choice.exe和回车就能获得按键输入的方法/黑科技

本帖最后由 523066680 于 2016-9-7 08:34 编辑
  1. @echo off
  2. :get_key
  3.   set "key="
  4.   for /f "delims=" %%a in ('xcopy /w "%~f0" "%~f0" 2^>nul') do if not defined key set "key=%%a"
  5.   set "key=%key:~-1%"
  6.   echo %key%
  7. pause
复制代码
不知道以前有没有人发过?明天再注明出处 :b


===================引用自===================
一个批处理版本的2048游戏
https://rosettacode.org/wiki/2048#Batch_File
作者: aa77dd@163.com    时间: 2016-9-7 06:18

本帖最后由 aa77dd@163.com 于 2016-9-7 06:49 编辑

这个方式好象能支持比 choice 更多的字符, 比如 , . / Tab 字符, 甚至组合键 Ctrl+A   Ctrl+Q 等

另外, 我把参数稍改了下, 在 win7 64 位仍能行
  1. xcopy /w . . 2^>NUL
  2. 或者
  3. xcopy /w \ \ 2^>NUL
复制代码
我能找到的最早出处

February 07, 2013, 03:07:23 AM

jeb @ www.computerhope.com

http://www.computerhope.com/forum/index.php/topic,135713.msg872140.html?PHPSESSID=70a491e69021f3e926539660fee754b9#msg872140

随后, jeb 又在 stackoverflow 和 groups.google.com/forum 都发表过此代码应用例

http://stackoverflow.com/questio ... r/15160168#15160168

https://groups.google.com/forum/ ... atch.nt/hpNOPhNfwtI


我找到的时间最早的示例代码
  1. @echo off
  2. setlocal EnableDelayedExpansion
  3. if "%~1"==":::" goto :spinnerThread
  4. :menuLoop
  5. <nul set /p menu=Select menu[1 or 2]=
  6. call :GetKey
  7. echo(
  8. echo Pressed '!key!'
  9. if !key!==1 call :menu1
  10. if !key!==2 call :menu2
  11. if !key!==2 call :menu2
  12. goto :menuLoop
  13. :menu1
  14. :menu2
  15. call :spinnerStart
  16. rem do some work
  17. ping localhost -n 3  > nl
  18. call :spinnerStop
  19. echo Finished
  20. exit /b
  21. :spinnerStart
  22. del spinnerStop.tmp > nul 2>&1
  23. start /b "" cmd /c "%~df0" :::
  24. exit /b
  25. :spinnerStop
  26. echo dummy > spinnerStop.tmp
  27. :__spinnerStop
  28. if exist spinnerStop.tmp goto :__spinnerStop
  29. exit /b
  30. :spinnerThread
  31. for /f %%a in ('copy /Z "%~f0" nul') do set "CR=%%a"
  32. set "spinChars=\|/-"
  33. :spinnerLoop
  34. set /a "spinner=(spinner + 1) %% 4"
  35. <nul set /p ".=Waiting...!spinChars:~%spinner%,1!!CR!"
  36. ping localhost -n 2 > nul 2>&1
  37. if not exist spinnerStop.tmp goto :spinnerLoop
  38. del spinnerStop.tmp > nul 2>&1
  39. echo(
  40. exit /b
  41. :GetKey
  42. set "key="
  43. for /F "usebackq delims=" %%L in (`xcopy /L /w "%~f0" "%~f0" 2^>NUL`) do (
  44.   if not defined key set "key=%%L"
  45. )
  46. set "key=%key:~-1%"
  47. exit /b
复制代码

作者: happy886rr    时间: 2016-9-7 07:28

回复 1# 523066680
这招不错啊, 摆脱了第三方,运行速度更佳。还有aa77dd@163.com提供的方案足以做个很棒的贪吃蛇。
作者: 523066680    时间: 2016-9-7 09:57

链接发在顶楼了,一个批处理版的2048游戏。
网站也不错,各种问题、游戏、各种语言编写的版本。
作者: CrLf    时间: 2016-9-7 12:19

回复 2# aa77dd@163.com


再简化:
  1. xcopy /w . 2^>NUL
复制代码
话说从链接中看到了熟悉的...
  1. for /f %%a in ('copy /Z "%~dpf0" nul') do set "CR=%%a"
复制代码
  1. For /F delims^=^ eol^= %%Z in ("!Char!") Do Set "Intro=0"
复制代码
  1. Echo(
复制代码
看来歪果仁也发现了这些
作者: aa77dd@163.com    时间: 2016-9-7 12:41

回复 5# CrLf

有个东西是一直想要的, 但从没看到, 今天突然发现, 至少对我来说, 是发现了黑科技哦
  1. certutil -decode
  2. certutil -decodehex
复制代码

作者: CrLf    时间: 2016-9-7 12:50

回复 6# aa77dd@163.com


    CrLf 对你使出会心一击:http://www.bathome.net/viewthread.php?tid=31883
作者: aa77dd@163.com    时间: 2016-9-7 13:02

本帖最后由 aa77dd@163.com 于 2016-9-7 13:12 编辑

回复 7# CrLf


支持的编码文件里 即使 有好多的 CRLF, 不管是本体真身, 还是克隆的, 统统都会被忽略啊

还有注释行, 所以我用这个来把任意的小 EXE 包含在 批处理文件里,

这样 通常 几k 的 EXE 哪用得着打包呢, 全直接在批处理里文本化就行了
作者: CrLf    时间: 2016-9-9 02:57

回复 5# CrLf


求证了一下,发现除了 delims^=^ 的用法,其他几条老外好像都比我们早发现...
看来哥还是比较叼的,全球首创~

顺便发现老外做的 asciiMap
http://www.dostips.com/forum/viewtopic.php?t=1733
作者: futurer    时间: 2016-10-11 08:51

回复 9# CrLf


    delims^=^是?......
作者: CrLf    时间: 2016-10-11 21:40

回复 10# futurer


    http://www.bathome.net/viewthread.php?tid=12500
作者: netbenton    时间: 2021-11-4 21:55

简化一下:
  1. for /F "tokens=2 delims=键" %%L in ('xcopy /w . 2^>nul') do set k=%%L
复制代码
有空把以前的游戏更新一下。哈哈!
作者: 523066680    时间: 2021-11-4 22:10

回复 12# netbenton

    前段时间还发现一个

[转载]CMD获取当前光标坐标、位置
http://bbs.bathome.net/viewthread.php?tid=58523&highlight=
作者: Echo11    时间: 2022-2-23 14:28

回复 2# aa77dd@163.com


   
这个方式好象能支持比 choice 更多的字符, 比如 , . / Tab 字符, 甚至组合键 Ctrl+A   Ctrl+Q 等

太有意思了,试了下,CTRL+C 不行;
Backspace可以,效果真的就是删除一个字符。比如:
  1. echo.key is:(%key%)
复制代码
输出结果就是:
  1. key is:)
复制代码
它真删了左边字符.
作者: ANSL    时间: 2022-12-19 15:51

这个好!正好来改我的菜单




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2