【问题标题】:Batch Script: Closes on space and certain characters from user input批处理脚本:关闭空间和用户输入的某些字符
【发布时间】:2013-08-14 21:21:43
【问题描述】:

在我创建的批处理脚本中,有时它会查看用户输入并根据 IF 语句执行相应的功能。如果用户输入不匹配,它将再次要求输入。我遇到的问题是,如果用户输入空格、、; 等,程序会突然终止。我尝试添加 if 语句来捕获它们并添加 @ECHO ON 来查看交互,但它似乎在用户按下回车时就死了。关于如何避免这种情况的任何想法?

【问题讨论】:

  • 请发布您的代码。

标签: batch-file


【解决方案1】:

CMD 有许多具有特殊含义的字符,这些字符通常被称为“毒字符”,因为如果将它们暴露给批处理解析器,它们会导致许多不良影响。示例包括 & | > < - 还有更多。

一般来说,如果字符被引用为">",或转义为^>,则不会导致问题。但是您无法控制用户输入的内容。使用正常扩展时,某些值根本不安全。例如,如果用户输入This & that "& the other thing",则无法在值周围添加引号以使& 都被引用。

谢天谢地,延迟扩展提供了一个简单的解决方案。不是使用%VAR% 扩展变量,而是使用!VAR!。该变量在解析器完成查看所有字符后 展开,因此毒字符不会引起任何问题。必须先使用setlocal enableDelayedExpansion启用延迟扩展

这是一个简单的演示,它可以成功地回显用户输入的任何值,无论出现什么有毒字符。您可以轻松地将代码调整为 IF 语句。

@echo off
setlocal enableDelayedExpansion
set /p "var=Enter a string: "
echo You entered: !var!

【讨论】:

  • 这很有帮助。现在所有用户输入看起来都类似于:SET /p "INPUT=What would you like to do? " 然后调用一个子例程来检查输入:CALL :InputCheck 看起来像这样::InputCheck IF /I "!INPUT!"=="PING" CALL :Ping & GOTO %Menu% 其他人喜欢它。这解决了空格和 ;导致错误,但是毒字符 (& | < >) 是问题。
  • 没关系,一切都很好。我必须记住在编辑/保存时不要编辑批处理,因为它会导致不可预测的结果。谢谢。
【解决方案2】:

双引号可以防止空格和大多数有毒字符。 IF 比较也需要它们。

set /p "variable=Enter your input: "
echo "%variable%"
if "%variable%"=="string" execute program

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-31
    • 1970-01-01
    • 1970-01-01
    • 2016-02-02
    相关资源
    最近更新 更多