Проверка ввода через командный файл - PullRequest
3 голосов
/ 14 апреля 2011

Я делаю ввод данных пользователем и проверяю, набрали ли они n или y ... и он не работает, потому что он говорит, что оба варианта.

Вот что у меня есть:

@echo off
set /P theuserinput="Type your name: "
echo So your name is: %theuserinput%?
set /P isit="Y/N: "
echo You typed: %isit%
if (%isit% == "y") goto :saidyes
if (%isit% == "n") goto :saidno

:saidyes
echo Hooray!

:saidno
echo Aww
PAUSE

Ответы [ 5 ]

4 голосов
/ 14 апреля 2011

Сначала вы можете добавить goto по умолчанию после двух if.

Затем в обоих тестах вы должны добавить кавычки около% isit% и удалить скобки. Вы также можете добавить флаг / I для сравнения строк без учета чувствительности.

Наконец, добавьте goto после каждого эха, чтобы перепрыгнуть через следующее.

@echo off
set /P theuserinput="Type your name: "
echo So your name is: %theuserinput%?
set /P isit="Y/N: "
echo You typed: %isit%
if /I "%isit%" == "Y" goto :saidyes
if /I "%isit%" == "N" goto :saidno
goto :error

:saidyes
echo Hooray!
goto :end

:saidno
echo Aww
goto :end

:error
echo ERROR

:end
PAUSE
2 голосов
/ 06 сентября 2012

Кавычки обычно неправильно используются в пакетных файлах DOS.В отличие от сценариев оболочки UNIX, пакетный язык DOS не продуман.Например, если переменная isit содержит кавычки

set isit="Y"

, то вышеприведенные операторы if расширяются до

IF ""Y"" == "Y" GOTO saidyes
IF ""Y"" == "N" GOTO saidno

, поскольку cmd.exe не удаляеткавычки в "%isit%"=="Y" перед оценкой выражения.

Кавычки в isit не должны встречаться с исходным командным файлом, размещенным здесь.Но часто вы обрабатываете пути в пакетных файлах, и Windows передает длинные имена файлов в кавычках, чтобы скрыть пробелы.Например, как в «C: \ Program Files (x86) \ Microsoft Visual Studio 10.0 \ VC» .Чтобы обойти это, обычно пишут операторы if так:

IF ["%isit%"] == ["Y"] GOTO saidyes
IF   [%isit%] == ["Y"] GOTO saidyes
IF   [%isit%] ==   [Y] GOTO saidyes

Для set isit="Y" это становится:

IF [""Y""] == ["Y"] GOTO saidyes
IF   ["Y"] == ["Y"] GOTO saidyes
IF   ["Y"] ==   [Y] GOTO saidyes

и для set isit=Y:

IF ["Y"] == ["Y"] GOTO saidyes
IF   [Y] == ["Y"] GOTO saidyes
IF   [Y] ==   [Y] GOTO saidyes

и для set isit=:

IF [""] == ["Y"] GOTO saidyes
IF   [] == ["Y"] GOTO saidyes
IF   [] ==   [Y] GOTO saidyes

, что далеко не элегантно, но, по крайней мере, теперь работает для переменных в кавычках и без кавычек.Это также работает, когда isit пусто.Часто пакетные файлы останавливаются из-за пустых переменных:

set x=
REM ...
IF %x% == x GOTO x

, потому что теперь оператор if расширяется до:

IF == x GOTO x

и cmd.exe не выполняется.Эти ошибки обычно трудно отладить.

Трюк очень старый;Я помню, как использовал его уже в MSDOS.Обратите внимание, что квадратные скобки не оцениваются cmd.exe ;это просто некоторые редко используемые персонажи.Но это всего лишь трюк.Любой расширенный пакетный скрипт нуждается в функции dequoting:

@echo off
 setlocal EnableExtensions
 setlocal EnableDelayedExpansion
 REM ...
 set /P isit="Y/N: "
 call :dequote isit
 REM ...
 IF "!isit!" == "Y" GOTO saidyes
 IF "!isit!" == "N" GOTO saidno
 REM ...
 goto done

:dequote
 for /f "delims=" %%A in ('echo %%%1%%') do set %1=%%~A
 goto :eof

:done

Подпрограмма deqote удаляет все двойные кавычки вокруг имени переменной, передаваемой функции.

После удаления кавычек []Трюк больше не требуется.Обратите внимание также на использование ! вместо %.Восклицательные знаки заставляют cmd.exe повторно развернуть isit.

2 голосов
/ 22 февраля 2012

Есть несколько вещей, которые я бы сделал по-другому, чтобы убедиться, что все работает правильно ...

Сначала исправленный код выглядит следующим образом, но в внизу указан мой рекомендуемый код:

@echo off
setlocal
set theuserinput=
set /P theuserinput="Type your name: "
echo So your name is: %theuserinput%?
set /P isit="Y/N: "
echo You typed: %isit%
if '%isit%'== 'Y' goto saidyes
if '%isit%'=='N' goto saidno


:saidyes
echo Hooray!
goto end

:saidno
echo Aww
goto end

:end
pause
endlocal
exit

Однако, чтобы убедиться, что вы получаете только Y или N, я бы добавил несколько вещей ...

Сначала я бы позаботился о том, чтобы вы захватили только первую букву, добавив:

IF NOT '%isit%'=='' set isit=%isit:~0,1%

Далее я бы позаботился о том, чтобы у вас были только заглавные буквы, поэтому вы можете поменять местами, если они строчные, потому что в некоторых случаях это не сработает, если CaSe неверен:

if '%isit%'== 'y' set isit=Y
if '%isit%'== 'Y' goto :saidyes
if '%isit%'=='n' set isit=N 
if '%isit%'=='N' goto :saidno

Окончательная редакция этого файла может выглядеть следующим образом:

@echo off
:top
set theuserinput=
set /P theuserinput="Type your name: "
echo So your name is: %theuserinput%?
set /P isit="Y/N: "
IF NOT '%isit%'=='' set isit=%isit:~0,1%
IF '%isit%'=='y' set isit=Y
IF '%isit%'=='Y' goto saidyes
IF '%isit%'=='n' set isit=N
IF '%isit%'=='N' goto saidno
goto top

:saidyes
echo You typed: %isit%
echo Hooray!
goto end

:saidno
echo You typed: %isit%
echo Aww
goto end

:end
pause
exit
2 голосов
/ 14 апреля 2011

Нужно изменить синтаксис

Вот модифицированный код

    @echo off
set /P theuserinput="Type your name: "
echo So your name is: %theuserinput%?
set /P isit="Y/N: "
echo You typed: %isit%
if "%isit%" == "Y" GOTO saidyes
if "%isit%" == "N" GOTO saidno

:saidyes
echo Hooray!
GOTO paused

:saidno
echo Aww

:paused
PAUSE

....

В вышеприведенном примере предполагается, что Y / N является заглавной буквойтолько.

0 голосов
/ 07 ноября 2014

Я немного изменил код, чтобы помочь решить вашу проблему.Вместо goto: (функция) вы просто говорите goto (функция)

@echo off
set /P theuserinput=Type your name: 
echo So your name is: %theuserinput%?
set /p isit=Y/N: 
echo You typed: %isit%
if %isit% == "y" goto saidyes
if %isit% == "n" goto saidno

:saidyes
echo Hooray!

:saidno
echo Aww
pause
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...