2010-06-11 3 views
3

Я использую set /p ниже, чтобы прочитать ввод пользователя , кажется, работает вне блока if, но внутри внутри, если блок не работает. Когда я запускаю сценарий второй раз, пользовательский ввод в блоке if печатает предыдущий пользовательский ввод.проблема в пакетном скрипте читать пользовательский ввод

тестовый скрипт:

@echo off 
set cond=true 
echo %cond% 
if %cond%==true (
echo "cond is true" 
REM the below input doesn't work 
set /p name1="enter your name" 
echo name is: %name1% 
) 

REM it works here 
set /p name2="enter your name" 
echo name is: %name2% 

спасибо

ответ

10

Читайте на замедленном расширении в help set.

По умолчанию переменные среды (%foo%) расширяются, когда cmd анализирует линию. И строка в этом случае представляет собой единый оператор, который может включать в себя полный скобковый блок. Поэтому после разбора блока все вхождения переменных среды заменяются значением во время разбора. Если вы измените переменную в блоке и снова ее используете, вы увидите старое значение просто потому, что оно уже было заменено.

Задержка расширение, которые могут быть разрешены с

setlocal enabledelayedexpansion 

переменных причинами окружающей среды размеченной с восклицательными знаками, а не знак процента (!foo!) должно оцениваться непосредственно перед выполнения заявления, которое после разбора ,

@echo off 
setlocal enabledelayedexpansion enableextensions 
set cond=true 
echo %cond% 
if %cond%==true (
echo "cond is true" 
REM the below input does work now 
set /p name1="enter your name" 
echo name is: !name1! 
) 
+0

Вы также можете запустить 'CMD.EXE', используя переключатель'/V: ON'. – NealB

+0

@neal: для большинства пакетных файлов это не жизнеспособный вариант. – Joey

+0

большое спасибо ... это ново для меня .. вы знаете, предлагаете какой-нибудь хороший ресурс, где я могу прочитать об этом? – jch

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