2017-02-01 4 views
-2

У меня всегда возникает эта проблема при написании пакетных скриптов. Всякий раз, когда у меня появляется запрос на скрипт, пользователь должен установить переменную, если вводится точка с запятой (это только один пример), скрипт будет закрыт. Есть ли способ предотвратить это?Предотвращение прерывания пакетного сценария при недопустимом вводе символов

Пример:

@echo off 
:1 
cls 
echo Please enter your ID: 
set /P id= 
if /i %id%==119 goto Tom 
if /i %id%==204 goto Brittany 
if /i %id%==12 goto Shannon 
if /i %id%==64 goto Jack 
goto 1 

:Tom 
cls 
echo Tom, you have to mow the lawn. 
pause>nul 
exit 

:Brittany 
cls 
echo Brittany, you have to fold the laundry. 
pause>nul 
exit 

:Shannon 
cls 
echo Shannon, you have to feed the dog. 
pause>nul 
exit 

:Jack 
cls 
echo Jack, you have to replace the radio's capacitors. 
pause>nul 
exit 

Что я хотел бы видеть, что работает скрипт:

C:\>myscript.bat 
Please enter your ID: 
asjfash;dfjlas;ldf 
asjfash;dfjlas;ldf==i was unexpected at this time. 

и сценарий закрывается.

Спасибо!

+4

Пожалуйста [править] Ваш вопрос и поделиться своим неисправным кодом, следуйте инструкциям для создания [ mcve]. – JosefZ

+0

Прошу прощения, JosefZ, я все еще новичок здесь. – ditheredtransparency

+0

Отображение _result_ является правильным и необходимым, но не достаточным; покажите свой неудачный _code_. Прочитайте [Синтаксис: символы, разделители и цитаты], (http://ss64.com/nt/syntax-esc.html). Определенно, вам нужно избегать точки с запятой, например.как в этом примере: 'if/i '% varname%" == "literal; string" call: labelE' – JosefZ

ответ

0

чтения Синтаксис: Escape Characters, Delimiters and Quotes:

разделителей

Разделители отделить один параметр из следующего - они делят командную строку на слова.

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

  • Comma (,)
  • SEMICOLON (;)
  • Равно (=)
  • Площадь ()
  • Вкладка (   )

Если пользователь вводит некоторую строку, содержащую какие-либо из перечисленных выше сепараторов (как set "id=1 19" то %id% содержит пробел), то

if /i %id%==119 goto Tom 

результаты в if /i 1 19==119 goto Tom ↑ this space causes error 19==119 was unexpected at this time

Определенно, вы должны разделителей исключений и всех других cmd -познаваемых символов следующим образом:

@echo off 
:1 
cls 
echo Please enter your ID: 
set /P id= 
if /i "%id%"=="119" goto Tom 
if /i "%id%"=="204" goto Brittany 
if /i "%id%"=="12" goto Shannon 
if /i "%id%"=="64" goto Jack 
goto 1 

rem script continues here 

FYI, Redirection article списки других cmd -poisonous символов, которые должны быть экранированы, как немаскированном появления в пакетном сценарии имеет следующий смысл:

  • - Single Ampersand: используется в качестве разделителя команд
  • && - Double Ampersand: условный разделитель команд (например, if errorlevel 0)
  • || - двухтрубной (вертикальная линия): условный разделитель команд (например, if errorlevel 1)
  • - ОДНОТРУБНОЙ: перенаправляет std.output одной команды в std.input другого
  • - Single Больше чем: перенаправляет вывод в файл или файл, как устройство
  • >> - Двойной больше, чем: выход будет добавлен в самом конце файла
  • - Меньше чем: перенаправлять содержимое файла в std.input команды
+0

Спасибо, что помогли мне с этим! Итак, когда я использую кавычки, значит ли это, что это будет только то, что я набираю? – ditheredtransparency

+0

Да, да. Однако попробуйте 'for% G in (« 1 <2,64; 119 ») сделать @for% g in (% ~ G) сделать @echo«% g »' и открыть окно 'cmd', чтобы увидеть, как анализировать многопользовательский ввод. В пакетном скрипте двойные знаки '%' в переменных цикла '% G' и'% g' как 'для %% G in (" 1 <2,64; 119 ") делают для %% g in (%% ~ G) сделать эхо "%% g" '. – JosefZ

+0

Прошу прощения, я не совсем понимаю – ditheredtransparency

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