0

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

4

2 回答 2

0

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!
于 2013-08-14T21:42:00.900 回答
0

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

set /p "variable=Enter your input: "
echo "%variable%"
if "%variable%"=="string" execute program
于 2013-08-15T00:09:36.597 回答