2010-06-11 146 views
3

我在下面用set /p来读取用户输入 它似乎在if块之外工作,但是如果块不工作,那么在块内部工作。 当我第二次运行脚本时,用户在if块中输入的内容会打印上一个用户输入。批处理脚本中的问题读取用户输入

测试脚本:

@echo off 
set cond=true 
echo %cond% 
if %cond%==true (
echo "cond is true" 
REM the below input doesn't work 
set /p name1="enter your name" 
echo name is: %name1% 
) 

REM it works here 
set /p name2="enter your name" 
echo name is: %name2% 

谢谢

回答

10

help set阅读上延迟扩展。

默认情况下,当cmd解析一行时,环境变量(%foo%)被展开。在这种情况下,一行是一个单独的语句,可以包括一个完整的加括号的块。因此,在解析块之后,在解析时,所有出现的环境变量都将替换为其值。如果您在块中更改了一个变量并再次使用该变量,则会看到原来的值,因为它已被替换。

延迟扩展,其可以与标记后感叹号代替百分号(!foo!

​​

原因环境变量被启用以进行执行的陈述后解析是之前直接评估。

@echo off 
setlocal enabledelayedexpansion enableextensions 
set cond=true 
echo %cond% 
if %cond%==true (
echo "cond is true" 
REM the below input does work now 
set /p name1="enter your name" 
echo name is: !name1! 
) 
+0

您还可以使用'/ V:ON'开关启动'CMD.EXE'。 – NealB 2010-06-11 18:34:14

+0

@neal:对于大多数不是可行的批处理文件。 – Joey 2010-06-11 18:34:57

+0

非常感谢你...这对我来说是新的..你知道吗我可以阅读有关它的任何好资源吗? – jch 2010-06-11 18:50:30