Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Крашится Bat после Else. Пытаюсь сделать переключатель параметра.

Ответить
Настройки темы
CMD/BAT - [решено] Крашится Bat после Else. Пытаюсь сделать переключатель параметра.

Новый участник


Сообщения: 6
Благодарности: 0

Профиль | Отправить PM | Цитировать


Изменения
Автор: dbillika
Дата: 18-01-2019
Если сугубо банально, то оно работает в упрощенном виде. И работает идеально.
Код: Выделить весь код
set x=900
set w=
:1
cls 
echo bla-bla-bla u select to: %x%
echo %w%
echo ============
choice /c 12 /n
if %ErrorLevel%==1 (if %x%==0 (set x=1 & set w=666 & goto 1) else set x=0 & set w=555 & goto 1)
if %ErrorLevel%==2 (if %x%==2 (set x=3 & goto 1) else set x=2 & goto 1)
goto 1
Но когда я дошел до своего проекта, оно крашится. И понять почему я не в силах. Возможно я ошибаюсь в синтаксисе, но где именно - не понимаю. Я пробовал это записывать по разному(else, else if. через goto и if в отдельных строках. всё что мог - перебрал).
Проблемная строка:
Код: Выделить весь код
if %ErrorLevel%==9 (if %vat%==обычный (set vat=только аудио & set va=--extract-audio --audio-format mp3 --audio-quality & cls & goto Гменю) else if %vat%==только аудио (set vat=обычный & set va=88 & cls & goto Гменю))
Смысл сего - переключение 2х параметров одной(двух) переменной в меню кликом 1й кнопы.

Отправлено: 14:06, 18-01-2019

 

Аватара для Elven

Ветеран


Сообщения: 992
Благодарности: 268

Профиль | Сайт | Отправить PM | Цитировать


Сильно критично чтобы все это было ванлайном? этж убицца такое читать.
Код: Выделить весь код
if %ErrorLevel%==9 (
 if %vat%==обычный (
  set vat=только аудио 
  set va=--extract-audio --audio-format mp3 --audio-quality 
  cls
  goto Гменю
 ) else (
 if %vat%==только аудио (
  set vat=обычный
  set va=88 
  cls
  goto Гменю
)))
Так оно приблизительно выглядит или где-то я напутал? Это значит "раз". Теперь "два": как именно 'оно крашится'?
Это сообщение посчитали полезным следующие участники:

Отправлено: 16:10, 18-01-2019 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Ветеран


Сообщения: 1274
Благодарности: 564

Профиль | Отправить PM | Цитировать


хотя бы так, там доработаете, а то не очень понятно из-за сумбурности
Код: Выделить весь код
@echo off
set x=0
set w=999

choice /c 12 /n
if %ErrorLevel%==1 call :xw1
if %ErrorLevel%==2 call :xw2
echo %x%
echo %w%
pause& exit

:xw1
 if %x%==0 (set x=1& set w=666) else (set x=0& set w=555)
exit /b

:xw2
 if %x%==2 (set x=3) else (set x=2)
exit /b

Последний раз редактировалось alpap, 18-01-2019 в 17:53. Причина: (иначе переопределение переменных - убрал)


Отправлено: 16:40, 18-01-2019 | #3


Новый участник


Сообщения: 6
Благодарности: 0

Профиль | Отправить PM | Цитировать


Цитата Elven:
Сильно критично чтобы все это было ванлайном? этж убицца такое читать. »
Понимаю. Извиняюсь. Стараюсь, но это трудно.

Цитата Elven:
как именно 'оно крашится'? »
Если изначально переменная имеет любое значение, то оно изменяется согласно if, но если в дело вступает else... окно тупо исчезает/закрывается. Поэтому я не могу уловить, почему. Полагаю - синтаксис. такое было в других местах в экспериментировании всей этой затеи.

До следующего упрощенного примера я допёр, когда разбирался в проблеме. Здесь все работает как надо, но вот там, где необходимо - не работает.
мх. утром я делал тоже самое, и когда x менялся с числа на слово, были краши.
Код: Выделить весь код
set x=900 
:1
cls & echo %x%
echo =======
 choice /c 12 /n
   if %ErrorLevel%==1 (if %x%==0 (set x=1 & goto 1) else (set x=0 & goto 1))
   if %ErrorLevel%==2 (if %x%==акула (set x=спит & goto 1) else (set x=акула & goto 1))
п.с. На Superuser указали на Setlocal EnableDelayedExpansion. Весь день в нем пытался разобраться... Озарения не пришло. Тяжело сообразить, как это вообще можно использовать. Понятным примером был:
Код: Выделить весь код
setlocal EnableDelayedExpansion
Set var1=Hello ABC how are you
Set var2=ABC
Set result=!var1:%var2%=Beautiful!
Echo [!result!]
Но он удаляет(т.е. заменяет) из строки. Он не может добавить между двух слов(по сути в пустое место посреди строки) предложение (либо мне не хватает знаний) т.к. что-то в строке меняется при вводе, что-то нужно добавить. Это для меня пока сложно и не в приоритете. Возможно есть другой подход. Но это уже другая тема.

Последний раз редактировалось dbillika, 18-01-2019 в 17:19.


Отправлено: 17:00, 18-01-2019 | #4


Аватара для Elven

Ветеран


Сообщения: 992
Благодарности: 268

Профиль | Сайт | Отправить PM | Цитировать


Так в скрипте (точнее в приведенном фрагменте) я вижу три "if" и только один "else". Отрабатывается всё, вполне возможно, правильно, но вдруг "if" сравнивает не так как хотелось бы?
Ну и, конечно если приводится реальный кусок кода, то я бы рекомендовал обратить внимание на вот это сравнение
Код: Выделить весь код
if %vat%==только аудио
для пущей наглядности можно сравнить два вот таких кода:
Код: Выделить весь код
if "test 1"=="test 1" (echo 1) else (echo 0)
и
Код: Выделить весь код
if test 1==test 1 (echo 1) else (echo 0)
и чтобы совсем уж наглядно просто в консоли их выполнить.
Это сообщение посчитали полезным следующие участники:

Отправлено: 18:13, 18-01-2019 | #5


Новый участник


Сообщения: 6
Благодарности: 0

Профиль | Отправить PM | Цитировать


Elven, Я понял. Проверил... и вернулся к тому, с чего всё это началось. А именно:
Код: Выделить весь код
set x=как же сложно
:1
cls & echo %x%
 choice /c 12 /n
   if %ErrorLevel%==1 (if "%x%"==акула (set x=спит & goto 1) else (set x=акула & goto 1))
Оно меняет только в одну сторону. В другую не работает. Вылета нет(они из за синтаксиса, да). Операция обрабатывается, но не присваевается.

Отправлено: 18:55, 18-01-2019 | #6


Ветеран


Сообщения: 1274
Благодарности: 564

Профиль | Отправить PM | Цитировать


dbillika,
если нужен перебор пунктов одной кнопкой о choice придется забыть, например так можно:
Код: Выделить весь код
@echo off
set n=1

:#
echo ----------------------------
echo Нажмите 1+Enter для перебора
echo ----------------------------& set /p z=
if "%z%"=="1" (
 echo:
 echo Действие для пункта: "%n%"
 echo:
 set /a n+=1& goto #
)
pause

Отправлено: 19:39, 18-01-2019 | #7


Аватара для Elven

Ветеран


Сообщения: 992
Благодарности: 268

Профиль | Сайт | Отправить PM | Цитировать


Код: Выделить весь код
set x=как же сложно
:1
cls & echo %x%
 choice /c 12 /n
   if %ErrorLevel%==1 (if "%x%"=="акула" (set x=спит & goto 1) else (set x=акула& goto 1))
Это сообщение посчитали полезным следующие участники:

Отправлено: 19:41, 18-01-2019 | #8


Новый участник


Сообщения: 6
Благодарности: 0

Профиль | Отправить PM | Цитировать


Кажись проблема в значении переменной. Какой же ужасный в cmd синтаксис.
Если работать с числами или одиночными словами, то все прекрасно.
Но если переменная имеет значение, например: "Вася пупкин" или "5 5 5" или ""8""... мозг полностью взрывается.
Если в IF переменную указывать в кавычках: if "%x%" проблем становится еще больше.
Как правильно отделить в строке значение переменной от остального текста? Обычно это кавычки. Я сейчас перебираю все что знаю, и ничего не помогает.
Как сказать переменной, что она: x="мама мыла раму", чтобы она имела значение: мама мыла раму без кавычек и пробелов, когда подставляется в любое место в коде? Но если она имеет значение без кавычек, то оператор if его забракует: if x=мама мыла раму - будет ошибкой.
Голова кипит жестко.

Отправлено: 19:45, 18-01-2019 | #9


Ветеран


Contributor


Сообщения: 2708
Благодарности: 1684

Профиль | Отправить PM | Цитировать


dbillika,
Код: Выделить весь код
@Echo Off
cls

Set "x=мама мыла раму"
rem Set "x=мама не мыла раму"

If "%x%"=="мама мыла раму" (
	Echo В букваре написано %x% под картинкой 
) Else (
	Echo У нас написано %x% при присвоении переменной x 

)
pause
Код: Выделить весь код
@Echo Off
cls

Set "x=мама мыла раму"
Set "x=мама не мыла раму"

If "%x%"=="мама мыла раму" Echo В букваре написано %x% под картинкой 
If Not "%x%"=="мама мыла раму" Echo У нас написано %x% при присвоении переменной x  

pause
Лучше бы Вы описали задачу, какое меню Вы хотите организовать. И надо стремиться накручиваить If на If и в нечитаемом виде.

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 18-01-2019 в 20:06.

Это сообщение посчитали полезным следующие участники:

Отправлено: 19:55, 18-01-2019 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Крашится Bat после Else. Пытаюсь сделать переключатель параметра.

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Загрузка - [решено] Windows 10 крашится после выхода из гибридного сна, холодный старт - нормальный Wusa Microsoft Windows 10 17 07-08-2016 12:41
После изменения любого параметра в Asus GPU tweak комп уходит в перезагрузку drkrol Непонятные проблемы с Железом 2 20-07-2016 22:37
CMD/BAT - [решено] Путь к текущей папке CMD после передачи параметра Dragokas Скриптовые языки администрирования Windows 1 16-01-2012 18:44
Загрузка - [решено] После изменения в BCD параметра nx (noexecute) WINDOWS не загружается Mike_Onkyo Microsoft Windows 7 5 29-12-2011 10:50
Из образа ERDC.iso пытаюсь сделать загрузочную флешку Flooper Автоматическая установка Windows 2000/XP/2003 2 01-04-2011 12:19




 
Переход