【问题标题】:How do I listen for a keystroke in batch如何批量监听击键
【发布时间】:2014-10-25 05:33:22
【问题描述】:

我需要我的代码循环遍历一个子程序,直到按下一个键。我不知道该怎么做。有什么帮助吗?

【问题讨论】:

  • 您好 Jonathan,Stack Overflow 最适合您尝试过某事但遇到困难的情况。你有什么可以在这里添加的代码,让我们知道你卡在哪里了吗?详情请见How to Ask
  • 查看这篇 Stack Overflow 帖子:stackoverflow.com/questions/1223721/…

标签: batch-file


【解决方案1】:

您可以为 Choice 命令使用 timeoutdefault 扩展名 例如:

:start
@echo off
cls
:loop1 
cls
echo press 1 for option 1 
echo press 2 for option 2 
echo press 3 for option 3 
echo press any other number key to tell the date
echo.
echo %time%
choice /t 1 /c 123456789q /d q >nul
if %errorlevel% EQU 10 goto loop1
if %errorlevel% EQU 1 goto 1
if %errorlevel% EQU 2 goto 2
if %errorlevel% EQU 3 goto 3
if %errorlevel% GEQ 4 goto end
goto loop1
:1
echo.
echo.
echo option 1 
echo.
pause 
exit 
:2
echo.
echo.
echo option 2
echo.
pause 
exit 
:3
echo.
echo.
echo option 3
echo.
pause 
exit 
:end
echo %date%
pause
Exit

在这种情况下,Choice 命令每隔 1 秒自动选择 Q 作为默认选项,因此如果用户键入 Q,它只会在循环中跳过 1 秒。但是,如果他们键入除 1、2、3 之外的任何数字键,程序将告诉日期。如果用户键入 1,程序将执行选项 1,对 2 和 3 执行相同的操作 任何其他键都不会做任何事情。唯一的缺点是您必须最多等待 1 秒,并且您必须为循环保留一个键

【讨论】:

    【解决方案2】:

    或者你可以直接输入:

    @echo off
    color 0a
    title KeyStrokeSim
    goto Start
    
    :Start
    cls
    echo Press D or F to continue...
    choice /c df /n
    if %errorlevel%==1 goto Finished
    if %errorlevel%==2 goto Finished
    
    :Finished
    echo You have Pressed D or F!
    pause
    goto Start
    

    【讨论】:

    • 它只检测批处理文件中的按键,因此您必须单击窗口并由于方法类型而按键;D
    【解决方案3】:

    你可以试试这个:

    Stroke.bat

    @echo off
    Echo. > Temp.txt
    :: You require choice.exe for this
    choice /c 1234567890qwertyuiopasdfghjklzxcvbnm
    Echo 1 > Temp.txt
    

    Main.bat

    @echo off
    set var=
    :: Code Prior to Loop
    
    
    :: Loop starts below
    start /b stroke.bat
    :loop
    
    ::: Loop Code Goes here
    :: 
    :: You will not be able to take user-input in loop
    :: Do not tamper with "var"
    :: To force exit the loop just "goto end"
    :: Note if you force exit the loop you will need to exit this bat
    ::   and start a new window (since Stroke will be running)
    ::
    ::: End of loop
    
    <Temp.txt set /p var=
    if "%var%" NEQ "1" goto loop
    :end
    
    :: Post loop code
    Exit
    

    这应该适用于任何字符或数字,但不适用于标点符号或 Enter、空格等。

    您可以通过将choice 替换为set /p 将其修改为仅适用于输入:

    @echo off
    Echo. > Temp.txt
    set /p v=
    Echo 1 > Temp.txt
    

    你可以使用enter,如果你没有choice.exe

    【讨论】:

      【解决方案4】:

      迟到的答案,但使用choiceSET /P,而是使用replace
      思路是这样的:

      @echo off
      SETLOCAL EnableDelayedExpansion
      echo Press any key...
      
      >keystroke.txt replace ? . /u /w
      FOR /F delims^=^ eol^= %%K in (
      '2^>nul findstr /R "^" "keystroke.txt"'
      ) do set "key=%%K"
      
      del /f /q "keystroke.txt"
      echo You pressed: [!key!]
      

      脚本利用REPLACE/W 选项。

      编辑:现在支持;(默认eol

      【讨论】:

      • 可以直接在命令上使用 for 循环完全放弃临时文件。 For /F "Usebackq Tokens=* Delims=" %%K in ('"replace ? . /u /w"') Do Set "Key=%%K"
      • 其中 ' 被替换为 `
      • @T3RR0R 不适用于;(我的脚本也是)
      • 如果需要;,解决方案很简单。定义:Set "SC=Press any key to continue . . .=;" 和 Substring Modify Key:Set Key=!Key:%SC%! 还是保存外部文件的需求
      • 关于你的剧本,是的。还有一个解决您的脚本中! 丢失的方法。将 Setlocal EnableDelayedExpansion 的位置重新定位到 Key 设置之后和 !Key! 之前!被回显。
      【解决方案5】:

      如果你想定义一个在一定时间内没有按键被按下的默认动作,你可以使用如下选择来定义一个按键:

      @Echo off
      :ExampleLoop
          Echo.[A] Action [B] Alternate Action
          For /F "delims=" %%C in ('Choice /T 10 /N /C:ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 /D B') Do (
              CLS & Set "Choice=%%C" & Call :Choice[1-%%C] || (CLS & Echo. %%C is not a valid Choice)
          )
      Goto :ExampleLoop
      
      :Choice[1-A]
          Echo %~0
          Echo Elective Command
      Exit /B 0
      :Choice[1-B]
          ECHO %~0
          Echo Default Command
      Exit /B 0
      

      上面将返回文字键而不是 ErrorLevel(注意:将所有字母都返回为大写)。

      通过使用带有 :Label 子例程的调用,并定义所有选择选项,可以避免烦人的错误提示,并通过对调用结果使用|| 条件测试输出自定义消息。 Label 方法还避免了在存在多个选项时进行复杂且通常混乱的条件测试的需要。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-17
        • 2013-07-18
        • 1970-01-01
        • 2021-06-16
        相关资源
        最近更新 更多