【发布时间】:2013-08-14 21:21:43
【问题描述】:
在我创建的批处理脚本中,有时它会查看用户输入并根据 IF 语句执行相应的功能。如果用户输入不匹配,它将再次要求输入。我遇到的问题是,如果用户输入空格、、; 等,程序会突然终止。我尝试添加 if 语句来捕获它们并添加 @ECHO ON 来查看交互,但它似乎在用户按下回车时就死了。关于如何避免这种情况的任何想法?
【问题讨论】:
-
请发布您的代码。
标签: batch-file
在我创建的批处理脚本中,有时它会查看用户输入并根据 IF 语句执行相应的功能。如果用户输入不匹配,它将再次要求输入。我遇到的问题是,如果用户输入空格、、; 等,程序会突然终止。我尝试添加 if 语句来捕获它们并添加 @ECHO ON 来查看交互,但它似乎在用户按下回车时就死了。关于如何避免这种情况的任何想法?
【问题讨论】:
标签: batch-file
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% 其他人喜欢它。这解决了空格和 ;导致错误,但是毒字符 (& | < >) 是问题。
双引号可以防止空格和大多数有毒字符。 IF 比较也需要它们。
set /p "variable=Enter your input: "
echo "%variable%"
if "%variable%"=="string" execute program
【讨论】: