在IF语句中使用SET / P时,不会设置变量

时间:2014-08-29 23:04:08

标签: windows batch-file windows-7 windows-7-x64

我已经编写了一个简单的批处理文件来安装Windows 7下的程序。我遇到了set /p VAR=PROMPT遇到的令人抓狂的错误:

输入丢弃的错误

这是一个简单的测试用例:

@echo off
setlocal

if exist "%USERPROFILE%\Documents" (
    set /p CONFIRM="Previous version is installed! Continue? (Y/n) "
    echo {%CONFIRM%}
)

if exist "%USERPROFILE%\Documents" (
    set /p CONFIRM="Previous version is installed! Continue? (Y/n) "
    echo {%CONFIRM%}
)

我跑了:

Previous version is installed! Continue? (Y/n) n
{}
Previous version is installed! Continue? (Y/n) n
{n}

请注意,当第一个set /p运行时,它实际上并未保存我的输入!

提示修改错误(相关?)

我怀疑,但我不确定,如果这与set /p中的一个更明显的错误相关,其中如果在定义{{1}的括号内,它会在第一个)处截断提示阻止:

if

至少这个版本会捕获我的输入,虽然它会破坏提示:

@echo off

if exist "%USERPROFILE%\Documents" (
    set /p CONFIRM=Previous version is installed! Continue? (Y/n)
    echo {%CONFIRM%}
)

的变通办法?

有什么想法吗?或Previous version is installed! Continue? (Y/nn {n} 只是如此错误以至于我无法使用它?

编辑:结论

感谢来自@npocmaka的链接和提示,我想我更了解发生了什么:"解析时间"与#34;运行时间"在set /p - 分隔的块内部与外部相同。因此这个例子:

()

当跑步时,显而易见的是“延迟”"在变量中获取块内的预期值:

@echo off

(
    set /p CONFIRM=^?
    echo {%CONFIRM%}
)

(
    set /p CONFIRM=^?
    echo {%CONFIRM%}
)

echo {%CONFIRM%}

虽然推迟扩​​展有效,但我仍然认为这种行为与我已经阅读的?foo {} ?bar {foo} {bar} 应该如何工作的每一个描述都不一致,尽管这对于课程来说是相同的。批处理文件。似乎set /p设置的变量在出现在块内时,会从之外的语法中逃脱。

我相信"提示错误"版本只能工作(sorta),因为它无意中提前关闭了块,批处理文件处理器并没有抱怨第二个不匹配的set /p

1 个答案:

答案 0 :(得分:1)

@echo off
setlocal enableDelayedExpansion

if exist "%USERPROFILE%\Documents" (
    set /p CONFIRM="Previous version is installed! Continue? ^(Y/n^) "
    echo {!CONFIRM!}
)

if exist "%USERPROFILE%\Documents" (
    set /p CONFIRM="Previous version is installed! Continue? ^(Y/n^) "
    echo {!CONFIRM!}
)
Endlocal

这有用吗?