ошибка cmd: goto был неожиданным в это время

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

::My first program

@echo off
:main menu
cls
echo what are you doing?
echo.
echo 1) Nothing :-P
echo 2) dancing
echo. 
set /p var="Choose answer:" 
if %answer% == 1 goto nothing
if %answer% ==2 goto dancing

:nothing
echo ok...chill

:dancing
echo nice

echo on

person user3604362    schedule 07.05.2016    source источник
comment
да, извините, это моя ошибка, но это все еще не работает. Я пробовал это раньше, затем изменил его на var, но забыл обновить файл. Я сделаю это.   -  person user3604362    schedule 08.05.2016
comment
ага, теперь работает. загрузил неправильный файл. Прости   -  person user3604362    schedule 08.05.2016
comment
Я отменил ваше редактирование, так как вы устранили проблему, которая существовала, когда вы вносили это редактирование. Вы не можете существенно изменить свой вопрос после того, как получите на него ответы, так как вы можете аннулировать эти ответы своим изменением.   -  person Ken White    schedule 08.05.2016
comment
:: — это ярлык. Команда комментария REM для примечания. Начните делать вещи правильно, а не неправильно.   -  person    schedule 08.05.2016
comment
@Noodles :: идиоматически является комментарием в пакетных файлах, функционирует как таковой почти во всех случаях и, возможно, гораздо более читаем. См. stackoverflow.com/questions/16632524. Педантичность, основанная на чистоте языка, несколько абсурдна на таком анахроничном языке, как партия. Люди приходят в пакет, чтобы что-то сделать, а не писать красивый код.   -  person Ryan Bemrose    schedule 08.05.2016
comment
Покажи мне документацию. Как вы не можете, это неправильно. Зачем делать что-то неправильно, если можно сделать это правильно. Учить людей делать что-то неправильно — неправильно.   -  person    schedule 08.05.2016
comment
Верно, и вы нигде в документации не можете показать мне, что он не также поддерживается. Это потому, что язык имеет очень плохую документацию (действительно, ТОЛЬКО официальная документация входит в команду help - даже ss64 является неофициальной). Видите ли, я тоже могу переложить бремя доказательства, хотя это не делает его менее ложным аргументом. Я дал вам ссылку на одно из лучших доступных объяснений. Если вы понимаете предостережения, изложенные в этом вопросе, вы знаете достаточно, чтобы использовать любой вариант.   -  person Ryan Bemrose    schedule 08.05.2016
comment
Я признаю, что бывают случаи, когда rem работает, а :: нет, и, как и в случае с любым другим языком, перед их использованием следует знать о подводных камнях. Но :: десятилетиями был хорошо понятым и общепринятым способом добавления комментария в пакетный файл. Хотя вы можете рассматривать использование :: в некоторых случаях как выстрел себе в ногу, вряд ли это смертельная рана на языке, который позволяет вам так много способов метафорически оторвать себе ногу.   -  person Ryan Bemrose    schedule 08.05.2016
comment
На самом деле, с таким количеством лучших альтернатив пакетной установке, предустановленных в Windows (VBScript, PowerShell, bash скоро), и многими другими, которые можно быстро установить, можно утверждать, что учить людей делать что-то в пакетном режиме неправильно. , и мы должны предостерегать людей от использования этого языка полностью, а не придираться к чистоте его комментариев.   -  person Ryan Bemrose    schedule 08.05.2016
comment
@Noodles — ss64.com/nt/rem.html   -  person SomethingDark    schedule 08.05.2016
comment
На этой странице двойное двоеточие не задокументировано как команда комментария, это особый случай метки, которая действует как комментарий. затем на странице рассказывается обо всех способах, которыми это не будет работать. Также эта страница не является документацией.   -  person    schedule 08.05.2016


Ответы (4)


Как указывали здесь другие, ваша проблема заключается в том, что вы установили переменную с именем var, а затем попытались прочитать переменную с именем answer. Корневое исправление состоит в том, чтобы выбрать одно имя и придерживаться его. Однако я хочу предложить еще два указателя.

Во-первых, при отладке пакетного файла удалите строку @echo off из его верхней части. Включив эхо, вы сможете увидеть, какая именно строка выполнялась, когда вы получили ошибку, что поможет вам быстрее найти решение.

Во-вторых, причиной завершения работы вашего пакетного файла была синтаксическая ошибка. Если переменная answer не установлена, ваш оператор if оценивается как

if == 1 goto nothing

Это недопустимый пакетный синтаксис, который вызвал ошибку "goto был непредвиденным в это время" и привел к завершению работы вашего пакетного файла. Ваш код по-прежнему будет получать эту ошибку, если пользователь вводит пустую строку, даже после устранения проблемы с неправильным именем переменной. Чтобы правильно обрабатывать пустые переменные в операторе IF, поместите квадратные скобки или кавычки вокруг каждой стороны == следующим образом:

if [%answer%]==[1] goto nothing

Таким образом, даже если переменная является пустой строкой, IF оценивается как if []==[1] goto nothing, что по-прежнему является допустимым оператором и, таким образом, не приведет к сбою вашего скрипта.

person Ryan Bemrose    schedule 08.05.2016

У вас нет %answer% для сравнения, потому что вы вводите ответ на свой вопрос в var. Либо измените set /p на использование answer

set /p answer="Choose answer:" 
if %answer% == 1 goto nothing
if %answer% ==2 goto dancing

или измените два оператора if, чтобы использовать var:

set /p var="Choose answer:" 
if %var% == 1 goto nothing
if %var% ==2 goto dancing
person Ken White    schedule 07.05.2016
comment
Да, извините, у меня был ответ раньше, он не работал, поэтому я изменил его на var, но он все еще не работал, а затем я забыл обновить его при загрузке сюда. Прости. Он не обновляется должным образом, но он все еще не работает - person user3604362; 08.05.2016
comment
Ах! теперь это работает .... загрузил неправильный файл. Спасибо - person user3604362; 08.05.2016

::My first program

@echo off
:mainmenu
cls
echo what are you doing?
echo.
echo 1) Nothing :-P
echo 2) dancing
echo. 
set /p answer="Choose answer: " 
if %answer%==1 goto nothing
if %answer%==2 goto dancing

:nothing
echo ok...chill
pause
goto mainmenu

:dancing
echo nice
pause
goto mainmenu

Это должно работать.

person Jelly    schedule 08.05.2016

Попробуйте это: здесь я установил var для ввода и сравнения.

  : : My first program
  @echo off
  :main menu
  cls
  echo .
  echo .
  echo what are you doing?
  echo 1) Nothing :-P
  echo 2) dancing
  echo .
  echo .
  echo choose answer:
  set /p var=
  IF %var%== 1 goto nothing
  IF %var%== 2 goto dancing

  :nothing
  echo ok...chill

  :dancing
  echo nice

  echo on
person Himanshu Gupta    schedule 07.05.2016
comment
Это не оболочка. Это пакетный файл Windows, и goto наверняка существует. - person Ken White; 08.05.2016
comment
Извините за недоразумение, я обновил свой ответ. - person Himanshu Gupta; 08.05.2016
comment
Ответы, содержащие только код, вызывают неодобрение. Вы должны хотя бы объяснить, что вы изменили и почему это соответствует тому, что ищет спрашивающий. - person SomethingDark; 08.05.2016