BAT-файл: странное поведение SET (?) - PullRequest
1 голос
/ 12 января 2012

У меня следующий код командного файла:

@echo off
SET INSTALL_PATH=c:\program files\
:ask_again
if exist "%INSTALL_PATH%" (
SET /P PATH_EXISTS_ANSWER=Path exists, overwrite?[y/n/default:n]
if not defined PATH_EXISTS_ANSWER (
    echo You chose default action^(N^). Try another installation path.
    echo.
    goto default
    )
if /I "%PATH_EXISTS_ANSWER%"=="n" (
    echo You chose not to use existing folder. Try another installation path.
    echo.
    goto noc
    )   
if /I "%PATH_EXISTS_ANSWER%"=="y" (
    echo You chose to overwrite existing folder. Existing files will be overwritten.
    echo.
    goto yesc
    )
echo Please choose Y or N
echo.
goto ask_again
)

:yesc
echo you said yes
goto end

:default
echo you said default
goto end

:noc
echo you said no
goto end

:end

И все нормально, когда я выбираю действие по умолчанию, просто нажимая Enter.Но когда я использую клавишу N или Y, значение PATH_EXISTS_ANSWER кажется неопределенным, скрипт переходит в другой цикл, а затем, независимо от того, что я отвечаю, скрипт почему-то использует предыдущий ответ.Например, если я отвечаю Y, скрипт снова спрашивает, и если я выбираю N, он печатает «вы сказали да».Что я делаю не так?

Ответы [ 2 ]

1 голос
/ 12 января 2012

После @echo off необходимо поставить следующее:

SETLOCAL EnableDelayedExpansion 

Затем, когда вы ссылаетесь на PATH_EXISTS_ANSWER, вместо того, чтобы заключать его в проценты, (%) заключите его в восклицательный знакМетки.(!) вот так: !PATH_EXISTS_ANSWER!

Я проверил, и это работает.

1 голос
/ 12 января 2012

Переменная установлена, поэтому определяется после 1-го выполнения; затем запустите файл в консоли типа echo %PATH_EXISTS_ANSWER%, и вы увидите, что вы ввели в последний раз.

, чтобы предотвратить это, либо установите PATH_EXISTS_ANSWER пустым ([]) в начале, либо лучше добавьте SETLOCAL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...