CMD игнорирует первый вход - PullRequest
0 голосов
/ 28 августа 2018

Следующая программа игнорирует первый вход, запросит снова и только затем примет вход.

@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 голосов
/ 28 августа 2018

вам понадобится отложенное расширение .
И НЕ используйте goto s и метки внутри блока кода! 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.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...