我已经编写了一个简单的批处理文件来安装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
。
答案 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
这有用吗?