Если вы вводите строку с set/p
, то нельзя сказать, что введенные данные не содержат Пробелы .Способ преодолеть это - "enclose the strings on both sides of the comparison operator in quotes"
- то есть двойные кавычки 'not single quotes'
SET / P "var = Prompt" не изменится var
, если ввести в одиночкунажата.Следовательно, если var
изначально пусто, оно остается пустым.
if /i "%var%"=="value"
выполняет сравнение с пустыми переменными / значениями или теми, которые содержат разделители (например, пробелы). '/ I' делает сравнение нечувствительным к регистру.
IF DEFINED var
имеет значение true, если var
равно в настоящее время определено (примечание: не %var%
.)
Синтаксис SET "var=value"
(где значение может бытьпусто; в этом случае var
становится undefined ) используется, чтобы гарантировать, что любые заданные пробелы НЕ включены в назначенное значение.
В вашем коде метка again
не определено, хотя может быть определена переменная again
(в зависимости от ввода пользователя).
Если вы введете какое-либо значение, которое не является ни y
, ни n
или пусто , тогда ваш код просто перейдет к следующему оператору, так что, например, если вы введете z
в первом set/p
, то выполнение будет просто проходить через все if
тесты допометьте second
и выполните вторую команду set /p
.
Например:
:: Ensure the variable "again" is not defined
:RETRY1
set "again="
:: Get user-input to "again"
set /p again=Repeat again? [Y/N]=
:: Test the value entered - ENTER only (first way)
if defined again (echo something was entered) else (echo ENTER only)
:: Test the value (second way - more conventional using /i to make case-insensitive)
if "%again%"=="" goto second
if /i "%again%"=="N" exit
if /i "%again%"=="Y" goto yes
:: We get here if the entry was neither ENTER alone, "Y" or "N"
echo "%again%" is not a valid response.
goto retry1