2015-02-03 3 views
0

Я хочу получить данные от пользователя в пакетном файле, но в то время как он отлично работает, когда я за пределами оператора if, когда я попадаю внутрь, он не получает вход пользователя.Невозможно принять пользовательский ввод в пакетном файле, если оператор if,

@echo off 

set /p flag=Enter letter 'y': 

echo %flag% 

if %flag% == y (
    set /p flag2=Enter random string: 

    echo flag2: %flag2% 
) 

pause 

В приведенном выше примере после того, как я вхожу «у» в первой строке, она выводит содержимое% флага%, а затем во второй строке внутри, если оператор, то% flag2% не получает никакого значения.

Выход:

Enter letter 'y': y 
y 
Enter random string:lalala 
flag2: 
Press any key to continue . . . 

Почему это происходит?

+0

возможно дубликат [Проблема с пользовательским вводом в моем батнике] (http://stackoverflow.com/questions/916413/problem-with-user-input-in-my-batch -file) – indiv

+0

@indiv Это действительно так. Спасибо. – TheCrafter

ответ

3

В пределах оператора блока (a parenthesised series of statements), блок всей анализируется и затем выполняются. Любой %var% в блоке будет заменен значением этой переменной на момент анализа блока - до того, как блок будет выполнен - ​​то же самое относится к FOR ... DO (block).

Следовательно, IF (something) else (somethingelse) будет выполнен с использованием значений %variables% в момент возникновения ошибки IF.

Два распространенный способ преодоления этого является: 1) использовать setlocal enabledelayedexpansion и использовать !var! вместо %var%, чтобы получить доступ к измененному значению var или 2) для вызова подпрограммы, чтобы выполнить дальнейшую обработку с использованием измененных значений.

Обратите внимание, что использование CALL ECHO %%var%% отображает измененное значение var. CALL ECHO %%errorlevel%% отображает, но, к сожалению, RESETS errorlevel.

попробовать

CALL echo flag2: %%flag2%% 
+0

Это сработало, и я понял, почему это происходит. Спасибо за ваше объяснение. – TheCrafter

2

Вы должны добавить эту строку в верхней или выше IF заявление:

SETLOCAL ENABLEDELAYEDEXPANSION 

Затем измените %flag2% на !flag2!.

+0

Спасибо за ваш ответ. Это сработало, но я соглашусь с ответом Магу, поскольку он более совершенен, поэтому более полезен для других людей, сталкивающихся с этой проблемой. – TheCrafter

Смежные вопросы