【问题标题】:How can I trap an ENTER keystroke in batch?如何批量捕获 ENTER 击键?
【发布时间】:2015-06-13 23:49:22
【问题描述】:

网站和一般脚本的新手。我知道您可以像这样创建用户输入:

set input=
set /p input=[y/n]: %=%

然后您可以使用“如果”来询问它们是否是确定的响应。示例:

if "%input%"=="y" goto a:

并通过说检查是否不是说输入

if "%input%" NEQ "y" goto b:

因为我没有受过教育,所以我不知道如何做到这一点,但我希望能够确定输入是否是回车键。 我试图通过使用来实现这一点

if "%input%"==[ENTER] goto a:

if "%input%"==enter

以及我能想到的用于确定击键是否为 [ENTER] 的所有方法。我可能只是愚蠢,但有没有办法做到这一点?谢谢。

【问题讨论】:

  • 如果他们只是敲回车,则字符串将为空白,前提是在设置命令之前为空白:if "%input%"==""
  • 您应该意识到为了结束set /P 命令而总是 按下ENTER 键,因此您的整个描述令人困惑。建议您将主题标题更改为“如何在 SET /P 命令中检测空输入”并相应修改描述...

标签: batch-file


【解决方案1】:

至少有两种方法可以做到这一点:检查值或检查操作

set /p 检索键入的输入,将其存储在变量中,但是当没有输入时,只需按 Enter 键,就不会对变量进行存储操作,因此它会保留其先前的值。

测试值的常用方法是清除变量内容,使用set /p,测试变量是否定义,即有内容

set "var="
set /p "var=[y/n]?"
if not defined var goto :noUserInput

我们还可以测试操作本身。在批处理文件中,大多数命令设置为某个值,内部errorlevel 变量指示命令执行的成功或失败。

set /p 的情况下,如果已检索到数据,它将设置errorlevel 为0,如果没有输入,则将其设置为1。然后if errorlevel构造可以用来判断是否有输入

set /p "var=[y/n]?"
if errorlevel 1 goto :noUserInput

正如 Aacini 指出的那样,这可能会失败。如果批处理文件具有.bat 扩展名,则读取数据的set /p 不会重置(设置为0)之前的errorlevel 值,因此需要先执行一些命令将errorlevel 设置为0。

ver > nul
set /p "var=[y/n]?"
if errorlevel 1 goto :noUserInput

如果批处理文件以.cmd 扩展名保存,则不需要。在这种情况下,set /p 在读取数据时会将errorlevel 设置为 0。

还可以使用条件执行运算符(&&||)。 && 如果上一个命令成功,则执行下一个命令。 || 如果上一个命令失败,将执行下一个命令。

set /p "var=[y/n]?" || goto :noUserInput

【讨论】:

  • 这里只是一个细节:当set /P 命令读取输入时,它NOT 修改errorlevel 的先前值,因此您需要确保errorlevel 在之前为零set /P。一个简单的方法是使用 VER 命令:ver > NULset /P var=if errorlevel 1 goto noInput
  • @Aacini,我曾经这么认为,但在发布答案之前,我从批处理文件(echo test | find "x"set /p data=,@987654349)中测试了它(XP SP3,我手头的东西) @) 并且它的工作原理如答案中所示。但是,正如您所指出的,从命令行 set /p 不会清除(设置为 0)错误级别。
  • @Aacini,准确地说,我从带有.cmd 实例的批处理文件中对其进行了测试。如果从带有.bat 扩展名的文件执行,则set /p 不会重置errorlevel。在这种情况下你是对的。
  • @Aacini,现在包含在答案中。谢谢。
  • 是:如果批处理文件具有.bat 扩展名,则错误级别更改。当批处理文件具有.cmd 扩展名时会更改!在 Win 8.1 上测试
【解决方案2】:
If not defined input ...

检测input是否有赋值。

编码

set "input="
set /p "input=[y/n]: "
if not defined input echo Enter alone detected

应该检测到单独被操作的回车键。

语法set "var=string" 确保行上的尾随空格不包含在分配的值中(它们很难看到)。

请注意,简单的 Enter 响应将使目标变量保持不变;它不会将 nothing 分配给变量。因此,明智的做法是确保在手动输入之前清除变量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-25
    相关资源
    最近更新 更多