проблема в пакетном скрипте чтения пользовательского ввода - PullRequest
3 голосов
/ 11 июня 2010

Я использую set /p ниже, чтобы прочитать пользовательский ввод, кажется, что он работает вне блока if, но тот, что внутри блока 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%

спасибо

1 Ответ

10 голосов
/ 11 июня 2010

Читайте о задержке расширения в 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!
)
...