以下程序将忽略第一个输入,将再次询问并仅接受输入。
@echo off
SETLOCAL
IF EXIST C:\Windows\notepad.exe (
:confirm
SET /P confirm="overwrite? yn "
echo entered: %confirm%
IF /I "%confirm%"=="y" GOTO overwrite
IF /I "%confirm%"=="n" GOTO no
GOTO confirm
:no
echo You selected no.
exit 1
:overwrite
echo You selected yes.
)
输入y<ENTER>
,y<ENTERY>
将导致输出:
overwrite? yn y
entered:
overwrite? yn y
entered: y
You selected yes.
输入y<ENTER>
,n<ENTER>
将导致输出:
overwrite? yn y
entered:
overwrite? yn n
entered: n
You selected no.
我从cmd /k input-test.cmd
开始编程。
删除IF EXIST
将删除该错误。
答案 0 :(得分:1)
您需要delayed expansion。
并且不要在代码块内使用goto
和标签! goto confirm
破坏了您的代码块,因此不再应用延迟扩展(这就是它第二次起作用的原因)。
但是只要稍微改变一下逻辑,就根本不需要代码块:
@echo off
SETLOCAL
IF NOT EXIST C:\Windows\notepad.exe GOTO :eof
:confirm
SET /P confirm="overwrite? yn "
echo entered: %confirm%
IF /I "%confirm%"=="y" GOTO overwrite
IF /I "%confirm%"=="n" GOTO no
GOTO confirm
:no
echo You selected no.
exit 1
:overwrite
echo You selected yes.
对于这样简单的用户问题,choice命令比set /p
更适合。它是自己的错误处理,因此将您的代码减少为:
@echo off
SETLOCAL
IF NOT EXIST C:\Windows\notepad.exe exit /b 2
choice /c YN /m overwrite?
IF errorlevel 2 goto no
if errorlevel 1 goto overwrite
:no
echo You selected no.
exit /b 1
:overwrite
echo You selected yes.