CMD忽略第一个输入

时间:2018-08-28 07:56:30

标签: cmd

以下程序将忽略第一个输入,将再次询问并仅接受输入。

@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将删除该错误。

1 个答案:

答案 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.
相关问题