2013-09-05 3 views
0

При использовании set /p внутри этого блока. Переменная input не установлена ​​на входное значение. Он устанавливается только при втором вызове скрипта (как если бы он был установлен только после строки echo %input%).Вход пакетного файла не работает корректно, если включен, если блок

if "%1"=="" (
     echo "You have to specify the name of the file." 
     set /p input=File name: 
     echo %input% 
     pause 

) else (
     ... 
) 

Что я могу сделать, чтобы иметь переменную input набор для значений, которые фактически вошли?

ответ

2

Вам необходимо использовать задержанное расширение.

На языке партии, внутри FOR или IF, переменные «расширены» до и не во время выполнения команды. (Расширенная = переменная remplaced его значением)

Например, следующий ЕСЛИ тест

IF condition (
foo 
bar 
) 

интерпретируется как if condition foo & bar

Таким образом, если переменная установлена ​​в foo и та же переменная используется в баре, это предыдущее значение переменной (перед тем, как вводить цикл), которое используется в bar.

Это любопытное беспокойство, но то, как работает пакет ... Так что он set работает правильно, это просто особый способ работы.

Вы должны написать SETLOCAL ENABLEDELAYEDEXPANSION в начале вашего кода, а переменная, расширение которой должно быть отложено, должно быть окружено ! вместо %.

Так echo %input% стать echo !input!

+0

Верно, я согласен с Жюльеном. Если вы включите задержку расширения, то SET/P будет работать внутри блока. – djangofan

+1

@djangofan - На самом деле, SET/P работает независимо. Это только отображение сохраненного значения, требующее замедленного расширения. – dbenham

+1

Условие 'if foo && bar' должно быть записано как' if condition foo & bar'. Как первоначально написано с '&&', 'bar' будет выполняться только в том случае, если' foo' прошел успешно. '||' является условным оператором для отказа. Простой оператор конкатенации команд - это единственный '&'. – dbenham

3

вам не нужно delayed expansion здесь. Пример:

if "%1"=="" (
     echo "You have to specify the name of the file." 
     set /p input=File name: 
     call echo %%input%% 
     pause 

) else (
     ... 
) 
Смежные вопросы