BAT文件:奇怪的SET(?)行为

时间:2012-01-12 11:36:12

标签: windows batch-file cmd environment-variables

我有以下批处理文件代码:

@echo off
SET INSTALL_PATH=c:\program files\
:ask_again
if exist "%INSTALL_PATH%" (
SET /P PATH_EXISTS_ANSWER=Path exists, overwrite?[y/n/default:n]
if not defined PATH_EXISTS_ANSWER (
    echo You chose default action^(N^). Try another installation path.
    echo.
    goto default
    )
if /I "%PATH_EXISTS_ANSWER%"=="n" (
    echo You chose not to use existing folder. Try another installation path.
    echo.
    goto noc
    )   
if /I "%PATH_EXISTS_ANSWER%"=="y" (
    echo You chose to overwrite existing folder. Existing files will be overwritten.
    echo.
    goto yesc
    )
echo Please choose Y or N
echo.
goto ask_again
)

:yesc
echo you said yes
goto end

:default
echo you said default
goto end

:noc
echo you said no
goto end

:end

只需按Enter即可选择默认操作。但是当我使用N或Y键时,PATH_EXISTS_ANSWER的值似乎未定义,脚本转到另一个循环然后,无论我回答什么,脚本为什么使用以前的答案。 例如,如果我回答Y脚本再次询问,如果我选择N,则键入“你说是的”。 我做错了什么?

2 个答案:

答案 0 :(得分:1)

设置变量,因此在第一次执行后定义;然后在控制台类型echo %PATH_EXISTS_ANSWER%中运行该文件,您将看到最后输入的内容。

要防止这种情况,请在开始时将PATH_EXISTS_ANSWER设置为空([]),或者更好地添加SETLOCAL

答案 1 :(得分:1)

您需要在@echo off之后添加以下内容:

SETLOCAL EnableDelayedExpansion 

然后,当您引用PATH_EXISTS_ANSWER时,(%)将其括在感叹号中,而不是用百分号括起来。 (!)像这样:!PATH_EXISTS_ANSWER!

我测试了它,它确实有用。