Форум программистов, компьютерный форум, киберфорум
Наши страницы
Batch (CMD/BAT)
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
dbillika
0 / 0 / 0
Регистрация: 18.01.2019
Сообщений: 6
1

Крашится Bat после Else. Пытаюсь сделать переключатель параметра

18.01.2019, 17:25. Просмотров 832. Ответов 11
Метки нет (Все метки)

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

Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
:Гменю
echo    [9]-Переключить режим (видео+аудио/аудио). Сейчас активен режим: %vat%
echo    ===============================================================
 
choice /c 12 /n
 
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=
  cls
  goto Гменю
)))
В упрощенном примере всё работает идеально, но не в моём.
Windows Batch file
1
2
3
4
5
6
7
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))
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.01.2019, 17:25
Ответы с готовыми решениями:

Запуск bat-файлов с параметрами, являющимися модификациями принятого запускающим bat-файлом параметра
Написать командный файл, который: • принимает в качестве параметра полное имя файла...

Программа крашится после компиляции
Помогите понять почему после компиляции вылетает Код запускается. Вылетает примерно после того...

Крашится приложение после setext
Всем здравствуйте, столкнулся с непонятной проблемой, запускаю приложение(отправляется строка на...

Не могу сделать вывод данных из таблицы БД (Пытаюсь сделать гостевую книгу)
Много статей всяких перечитал, и везде по-разному описывается моя проблема... Запись в БД есть, все...

Крашится программа после нажатия на кнопку
Когда нажимаю на клавишу button2 крашится программа в чем проблема? public class Main3Activity...

11
alpap
1817 / 1333 / 435
Регистрация: 26.04.2015
Сообщений: 4,569
18.01.2019, 17:31 2
чем это-то не понравилось? (Вы знаете где)
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@echo off
set x=0
set w=999
 
>nul choice /c 12 /n
if %ErrorLevel%==1 call :xw "0" 
if %ErrorLevel%==2 call :xw "2"
echo %x%
echo %w%
pause& exit
 
:xw
 if %~1==0 (set x=1& set w=666) else (set x=0& set w=555)
 if %~1==2 (set x=3) else (set x=2)
exit /b
0
dbillika
0 / 0 / 0
Регистрация: 18.01.2019
Сообщений: 6
18.01.2019, 17:34  [ТС] 3
alpap Я пока пытаюсь с этим(вашим примером) разобраться, подстроив в реальность.
0
alpap
1817 / 1333 / 435
Регистрация: 26.04.2015
Сообщений: 4,569
18.01.2019, 17:51 4
значения только свои в set поставьте, всего и делов.

Добавлено через 8 минут
кстати, правильно будет, если именно относительно %x%, надо плясать
if %ErrorLevel%==1 call :xw "%x%"
if %ErrorLevel%==2 call :xw "%x%"

Добавлено через 6 минут
нет, все-таки только так, иначе по вашей задумке выйдет переопределение переменных и ответ будет неправильный
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@echo off
set x=0
set w=999
 
>nul choice /c 12 /n
if %ErrorLevel%==1 call :xw1 "%x%" 
if %ErrorLevel%==2 call :xw2 "%x%"
echo %x%
echo %w%
pause& exit
 
:xw1
 if %~1==0 (set x=1& set w=666) else (set x=0& set w=555)
exit /b
 
:xw2
 if %~1==2 (set x=3) else (set x=2)
exit /b
0
dbillika
0 / 0 / 0
Регистрация: 18.01.2019
Сообщений: 6
18.01.2019, 17:54  [ТС] 5
alpap ну...
так не работает:
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
set x=0
:11
cls
echo _%x%_
echo ===========
>nul choice /c 12 /n
if %ErrorLevel%==1 call :xw "акула"
 
:xw
 if %~1==акула (set x=спит & goto 11)
 if %~1==спит (set x=акула & goto 11)
goto 11
А вот так работает:
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
set x=акула
:11
cls
echo _%x%_
echo ===========
>nul choice /c 12 /n
if %ErrorLevel%==1 call :xw
 
:xw
 if %x%==акула (set x=спит & goto 11)
 if %x%==спит (set x=акула & goto 11)
goto 11
так же как и: (но здесь изначально переменную можно задать любой.)
Windows Batch file
1
2
3
4
5
6
set x=900 
:1
cls & echo %x%
echo =======
 choice /c 1 /n
   if %ErrorLevel%==1 (if %x%==акула (set x=спит & goto 1) else (set x=акула & goto 1))
В свой пример еще не внедрил. щас попробую.(ну как щас... я медленный.)
upd: Ох вы уже дополнили ответ. Мне нужно время это переварить.
0
alpap
1817 / 1333 / 435
Регистрация: 26.04.2015
Сообщений: 4,569
18.01.2019, 18:13 6
Цитата Сообщение от dbillika Посмотреть сообщение
так не работает:
нельзя мешать call и goto
Цитата Сообщение от dbillika Посмотреть сообщение
if %ErrorLevel%==1 call
...
Цитата Сообщение от dbillika Посмотреть сообщение
goto 11
только четко по шаблону в посте 4

Добавлено через 8 минут
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@echo off
set x=акула
 
>nul choice /c 12 /n
if %ErrorLevel%==1 call :xw1 "%x%" 
if %ErrorLevel%==2 call :xw2 "%x%"
echo %x%
pause& exit
 
:xw1
 if %~1==акула set x=спит
exit /b
 
:xw2
 if %~1==спит set x=акула
exit /b
Добавлено через 8 минут
наверное стоит вам пояснить что в 7 строке echo %x%, это уже конечный результат, после выполнения подпрограммы (вот почему она обязательно должна закончиться exit /b, выйти надо) мы возвращаемся в основной код на строку после вызова этой самой подпрограммы, т.е. на строку после call, т.е. на echo %x%, если ее еще раз написать в 3й строке, то будет видно чему была равна переменная х до выполнения подпрограммы и после.
0
dbillika
0 / 0 / 0
Регистрация: 18.01.2019
Сообщений: 6
18.01.2019, 18:14  [ТС] 7
т.е. на одну кнопку это сделать нельзя? Нужно именно на 1 кнопку.
У меня меню на данный момент такое:
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
echo    =================================================================
echo    [1]-MKV с рекомендуемыми настройками для Youtube (x264)
echo    [2]-Ручные настройки кодирования
echo    [3]-WEBM
echo    [4]-AAC
echo    [5]-GIF
echo    [6]-mp4
echo    -----------------------------------------------------------------
echo    -----------------------------------------------------------------
echo    [7]-Скачать видео по ссылке (Можно использовать ссылку на плейлист Youtube. Скачаются все видео из плейлиста)
echo    [8]-Скачать видео списоком  (Взависимости от сайта срок жизни ссылок варьируется от 1 часа до 1 дня.)
echo    [9]-Переключить режим скачивания (видео+аудио/аудио). Сейчас активен режим: %vat%
 
echo    [0]-Выход
echo    =================================================================
 
choice /c 1234567890 /m "Нажми на клавиатуре клавишу, согласно пункту меню:"
if %ErrorLevel%==1 (goto forYoutube)
if %ErrorLevel%==2 (goto ручныенастройки)
if %ErrorLevel%==3 (goto WEBM)
if %ErrorLevel%==4 (goto AAC)
if %ErrorLevel%==5 (goto GIF)
if %ErrorLevel%==6 (goto mp4)
if %ErrorLevel%==7 (goto )
if %ErrorLevel%==8 (goto )
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 Гменю
)))
if %ErrorLevel%==10 (exit)
if %ErrorLevel%==11 (goto end)
 
:ручныенастройки
cls
echo    Качествоодирования. (17-35)где 17-лучшее.
echo    =================================================================
echo    [1]-Текущее качество:[%crf%]
echo    [2]-Текущяя ширина:[%scale%]
echo    [3]-Текущий формат:[%format%]
echo    [4]-Начать кодирование.
echo    [0]-Отмена
echo    =================================================================
choice /c 12340 
if /I %errorlevel%==1 (set /p crf="Введи качество от 17 до 35.(чем больше, тем качественнее):" & goto ручныенастройки)
if /I %errorlevel%==2 (set /p scale="Введи ширину в пикселях (360, 720, 1080):" & goto ручныенастройки)
if /I %errorlevel%==3 (set /p format="введите формат mkv, mp4, webm...")
if /I %errorlevel%==4 (%цикл% ffmpeg -y -i "%%a" -vf yadif,scale=%scale%:-2 -c:v libx264 -preset slow -crf 20 -c:a aac -b:a 256k "out\%%~nacustom.mkv" ) & goto end)
if /I %errorlevel%==5 (cls & goto Гменю)
goto end
И я застрял как раз в этом примере, где нужно одной кнопкой переключать параметр с одного на другой. Это удобно юзать.


Казалось чем в чем проблема оператора?. Если x не акула, то х=спит, иначе х=акула.
Только вместо акул и сна либо пусто, либо -vf yadif,scale=%scale%:-2 к примеру.
На "пусто" у меня тоже загвоздка. я до нее, думаю допру сам.
А вот в этим переменным не могу. неделю бьюсь.
0
alpap
1817 / 1333 / 435
Регистрация: 26.04.2015
Сообщений: 4,569
18.01.2019, 18:26 8
Цитата Сообщение от dbillika Посмотреть сообщение
Если x не акула, то х=спит, иначе х=акула.
Windows Batch file
1
2
3
4
5
6
@echo off
set x=акула
>nul choice /c 12 /n
if "%errorlevel%"=="1" set x=спит
echo %x%
pause
Цитата Сообщение от dbillika Посмотреть сообщение
нужно одной кнопкой переключать параметр с одного на другой.
поясните конкретнее, везде выше у вас выбор из двух кнопок: choice /c 12 /n
0
dbillika
0 / 0 / 0
Регистрация: 18.01.2019
Сообщений: 6
18.01.2019, 18:34  [ТС] 9
Цитата Сообщение от alpap Посмотреть сообщение
поясните конкретнее, везде выше у вас выбор из двух кнопок: choice /c 12 /n
да, но используется то одна. Одна и должна использоваться.
Нажал идет проверка
Цитата Сообщение от alpap Посмотреть сообщение
Если x не акула, то х=спит, иначе х=акула.
Нажал еще раз идет та же самая проверка и переменная меняет значение.
Цитата Сообщение от alpap Посмотреть сообщение
Если x не акула, то х=спит, иначе х=акула.
нажал опять... и все по кругу бесконечно.

Оно так и работает здесь:
Цитата Сообщение от dbillika Посмотреть сообщение
set x=акула
:11
cls
echo _%x%_
echo ===========
>nul choice /c 12 /n
if %ErrorLevel%==1 call :xw
:xw
if %x%==акула (set x=спит & goto 11)
if %x%==спит (set x=акула & goto 11)
goto 11
Но не в первом посте. "сами знаете где" дали небольшую наводку. Пытаюсь копать в ту сторону.
0
alpap
1817 / 1333 / 435
Регистрация: 26.04.2015
Сообщений: 4,569
18.01.2019, 19:35 10
Цитата Сообщение от dbillika Посмотреть сообщение
нажал опять... и все по кругу бесконечно
цикл без выхода? Для чего менять переменную в бесконечном цикле. Если вы имеете ввиду триггер 0-1-0-1..., то вам придется запоминать последнее состояние кроме изначального и куда-то записывать, в отдельный файл, например, иначе при повторном запуске скрипта ничего из запомненного не сохранится.

Добавлено через 1 минуту
если разовый запуск - только противоположное значение, то в посте 8

Добавлено через 44 минуты
я вроде понял что вам надо, перебор одной кнопкой нескольких значений (пунктов), но с choice такой вариант не пройдет, например так:
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
@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
0
dbillika
0 / 0 / 0
Регистрация: 18.01.2019
Сообщений: 6
18.01.2019, 19:42  [ТС] 11
Как же вам объяснить... Кажется банальнее того, что пишу уже некуда.
Это всего лишь мизерный кусок, пример. В этом ключе он должен быть бесконечным.
Для выхода существует другая, отдельная "клавиша", %errorlevel% если хотите.. (Их там будет еще 10+ и каждая из них делает тоже самое, но с другими значениями.)
Сейчас и только сейчас вопрос стоит одним ребром:
Почему команда ниже меняет значение переменной только при False. А когда условие TRUE действие НЕ выполняется?
Код
set x=как же сложно
:1
cls & echo %x%
 choice /c 12 /n
   if %ErrorLevel%==1 (if "%x%"==акула (set x=спит & goto 1) else (set x=акула & goto 1))
   if %ErrorLevel%==2 exit


Кажись проблема в значении переменной. Какой же ужасный в cmd синтаксис.
Если работать с числами или одиночными словами, то все прекрасно.
Но если переменная имеет значение, например: "Вася пупкин" или "5 5 5" или ""8""... мозг полностью взрывается.
Если в IF переменную указывать в ковычках: if "%x%" проблем становится еще больше.
Как правильно отделить в строке значение переменной от остального текста? Обычно это кавычки. Я сейчас перебираю все что знаю, и ничего не помогает.
Как сказать переменной, что она: x="мама мыла раму", чтобы она имела значение: мама мыла раму без ковычек и пробелов, когда подставляется в любое место в коде? Но если она имеет значение без кавычек, то оператор if его заброкует: if x=мама мыла раму - будет ошибкой.
Голова кипит жестко.
0
alpap
1817 / 1333 / 435
Регистрация: 26.04.2015
Сообщений: 4,569
18.01.2019, 20:38 12
Лучший ответ Сообщение было отмечено dbillika как решение

Решение

Цитата Сообщение от dbillika Посмотреть сообщение
Как сказать переменной, что она: x="мама мыла раму", чтобы она имела значение: мама мыла раму без ковычек и пробелов, когда подставляется в любое место в коде? Но если она имеет значение без кавычек, то оператор if его заброкует: if x=мама мыла раму - будет ошибкой.
вот разные варианты, нельзя сказать что среди них есть правильные и неправильные, для каждой задачи может быть по-разному, но вот общепринятые и логичные и работающие практически для любого случая есть. А в этом коде сработают только те в которых в условии ТОЧНО совпадут левая и правая части:
Кликните здесь для просмотра всего текста

Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
@echo off
set "x1=мама мыла раму"
set x2="мама мыла раму"
set x3=мама мыла раму
set "x4="мама мыла раму""
::---------------------------------
echo set "x1=мама мыла раму"
echo set x2="мама мыла раму"
echo set x3=мама мыла раму
echo set "x4="мама мыла раму""
echo.
 
call :#1 "%x1%" "%x2%" "%x3%" "%x4%"
call :#2 "%x1%" "%x2%" "%x3%" "%x4%"
call :#3 "%x1%" "%x2%" "%x3%" "%x4%"
call :#4 "%x1%" "%x2%" "%x3%" "%x4%"
echo -------------------------------------------
pause>nul& exit
 
:#1
 echo -------------------------------------------
 echo if "%x1%"=="%~1"
 echo if "%x2%"=="%~1"
 echo if "%x3%"=="%~1"
 echo if "%x4%"=="%~1"
exit /b
 
:#2
 echo -------------------------------------------
 echo if "%x1%"=="%1"
 echo if "%x2%"=="%1"
 echo if "%x3%"=="%1"
 echo if "%x4%"=="%1"
exit /b
 
:#3
 echo -------------------------------------------
 echo if %x1%==%~1
 echo if %x2%==%~1
 echo if %x3%==%~1
 echo if %x4%==%~1
exit /b
 
:#4
 echo -------------------------------------------
 echo if %x1%==%1
 echo if %x2%==%1
 echo if %x3%==%1
 echo if %x4%==%1
exit /b
1
18.01.2019, 20:38
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.01.2019, 20:38

Сайт крашится после 20 минут работы
Привет ребятки, вот такая проблема, давно ломаю голову. Есть сайт-приложение...

Программа крашится после вызова метода
Суть программы в том, чтобы выводить поздравление, используя имена, праздники и пожелания, которые...

Приложение крашится после присвоения обработчика
Приложение крашится при таком коде: package com.mathahakar.e_cigmaster; import...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru