Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Крашится Bat после Else. Пытаюсь сделать переключатель параметра. (http://forum.oszone.net/showthread.php?t=338802)

dbillika 18-01-2019 14:06 2853116

Крашится Bat после Else. Пытаюсь сделать переключатель параметра.
 
Если сугубо банально, то оно работает в упрощенном виде. И работает идеально.
Код:

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й кнопы.

Elven 18-01-2019 16:10 2853130

Сильно критично чтобы все это было ванлайном? этж убицца такое читать.
Код:

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 Гменю
)))

Так оно приблизительно выглядит или где-то я напутал? Это значит "раз". Теперь "два": как именно 'оно крашится'?

alpap 18-01-2019 16:40 2853134

хотя бы так, там доработаете, а то не очень понятно из-за сумбурности
Код:

@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


dbillika 18-01-2019 17:00 2853137

Цитата:

Цитата 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!]

Но он удаляет(т.е. заменяет) из строки. Он не может добавить между двух слов(по сути в пустое место посреди строки) предложение (либо мне не хватает знаний) т.к. что-то в строке меняется при вводе, что-то нужно добавить. Это для меня пока сложно и не в приоритете. Возможно есть другой подход. Но это уже другая тема.

Elven 18-01-2019 18:13 2853144

Так в скрипте (точнее в приведенном фрагменте) я вижу три "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)
и чтобы совсем уж наглядно просто в консоли их выполнить.

dbillika 18-01-2019 18:55 2853152

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))

Оно меняет только в одну сторону. В другую не работает. Вылета нет(они из за синтаксиса, да). Операция обрабатывается, но не присваевается.

alpap 18-01-2019 19:39 2853165

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


Elven 18-01-2019 19:41 2853166

Код:

set x=как же сложно
:1
cls & echo %x%
 choice /c 12 /n
  if %ErrorLevel%==1 (if "%x%"=="акула" (set x=спит & goto 1) else (set x=акула& goto 1))


dbillika 18-01-2019 19:45 2853168

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

megaloman 18-01-2019 19:55 2853170

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 и в нечитаемом виде.

YuS_2 18-01-2019 20:09 2853172

Цитата:

Цитата dbillika
Голова кипит жестко. »

Если вместо того, чтобы разобраться с синтаксисом, копировать сообщения на разные форумы, а потом пытаться вникнуть в ответы... мозг взорвется, а не только закипит :)


Цитата:

Цитата dbillika
Если в IF переменную указывать в кавычках: if "%x%" проблем становится еще больше. »

Никаких проблем не будет, если запомнить, что в условном блоке сравниваемые элементы в виде текста, лучше помещать в кавычки, а числа надо сравнивать наоборот, без кавычек:
Код:

if "это текст"=="это текст" (echo Yes)
if "2 3 4"=="2 3 4" (echo И это текст)
if 2 leq 5 (echo А это числа)
if 555==555 (echo И это числа)

Цитата:

Цитата dbillika
x="мама мыла раму", чтобы она имела значение: мама мыла раму без кавычек и пробелов »

без кавычек:
Код:

set "x=мама мыла раму"
но вот без пробелов... это в каком месте?
Например, если надо уничтожить все пробелы:
Код:

set "x=мама мыла раму"
echo [%x: =%]

Цитата:

Цитата dbillika
Но если она имеет значение без кавычек, то оператор if его забракует: if x=мама мыла раму - будет ошибкой. »

с чего бы это, если соблюдать синтаксис?
Код:

set "x=мама мыла раму"
if "%x%"=="мама мыла раму" echo Yes


YuS_2 18-01-2019 20:17 2853174

Цитата:

Цитата megaloman
Надо »

Это да, но это-то было опечаткой, которая, кстати, сразу же была исправлена... :)

alpap 18-01-2019 20:24 2853175

Цитата:

Цитата dbillika
Как сказать переменной, что она: x="мама мыла раму", чтобы она имела значение: мама мыла раму без кавычек и пробелов, когда подставляется в любое место в коде? Но если она имеет значение без кавычек, то оператор if его забракует: if x=мама мыла раму - будет ошибкой. »

вот разные варианты, нельзя сказать что среди них есть правильные и неправильные, для каждой задачи может быть по-разному, но вот общепринятые и логичные и работающие практически для любого случая есть. А в этом коде сработают только те в которых в условии ТОЧНО совпадут левая и правая части:
Код:

@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


dbillika 18-01-2019 20:27 2853177

Хоспади... Триклятые ковычки!
Спасибо megaloman, это именно оно. Какими словами это нужно было сказать гуглу, чтобы он понял меня - не представляю.

Ну вообщем, если интересно, я по крупицам собираю интерфейс управления ffmpeg и youtube-dl. Из знаний - дедукция и поверхностный Pascal школьных лет..
За пол года удалось настрочить это чудо(внутри много набросков и сохраненных из разных источников примеров, чтобы слепить всё воедино):
Код:

@chcp 1251 & cls & @echo off

::установка переменных
cd %userprofile%/desktop/ffmpeg
set цикл==for %%a in ("in\*.*") do (
set crf=23
set va=
set vat=видео+аудио
set scale=720
set format=mkv
set reverse=
:Гменю
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 (
  set "vat=только аудио"
  set "va=null"
  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


:кодировка
cls
:: Меню "Кодирование"
echo ###############################################################
echo # 1. Lля Youtube.
echo # 2. Добавить логотип (закинуть в корневую папку файл с именем logo.png)
echo # 3. .......
echo # 4. .......
echo ###############################################################
set /p x="ввидите цифрцу:_"
if /I %x%==1 (goto forYoutube)
if /I %x%==2 (goto логотип)

:forYoutube
%цикл%ffmpeg -y -threads %NUMBER_OF_PROCESSORS% -i "%%a" -vf yadif -c:v libx264 -preset slow -profile:v high -crf 18 -coder 1 -pix_fmt yuv420p -movflags +faststart -g 30 -bf 2 -c:a aac -b:a 384k -profile:a aac_low "out/%%~na.mkv" -hide_banner)
goto end

:логотип
cls
if /I %x%==2 %цикл%
ffmpeg -i input.mp4 -i logo.png -filter_complex "[0:v][1:v]overlay=main_w-overlay_w-20:main_h-overlay_h-20" result.mp4
)) goto end



:GIF
%цикл% ffmpeg -y -i "%%a" -vf scale=320:-1 -r 10 "out\%%~na.gif" )
goto end



rem ###### MKV
if /I %x%==mkv (
for %%a in ("in\*.*") do (
ffmpeg -i "%%a" -c:v libx264 -preset slow -crf 22 -x264-params keyint=123:min-keyint=20 -c:a copy "out\%%~na.%x%"
)
)
goto end

:webm
%цикл% ffmpeg -y -i "%%a" -c:v libvpx-vp9 -quality good -b:v 2M "out\%%~na.webm" )
goto end

:mp4
%цикл% ffmpeg -y -i "%%a" -vf yadif,scale=%scale%:-2 -c:v libx264 -preset slow -crf 20 -c:a aac -b:a 256k "out\%%~natest.mkv" )
goto end

rem ###### WEBP
if /I %x%==webp (
for %%a in ("in\*.*") do (
ffmpeg -y -i "%%a" -vcodec libwebp -lossless 1 -q:60 -preset default -loop 1 -an -vsync 0 "out\%%~na8 веб П.%x%"
)
)
goto end
:mp3
if /I %x%==mp3 (
for %%a in ("in\*.*") do (
ffmpeg -y -i "%%a" "out\%%~na.%x%"
)
)
goto end

:: ######## Начало скаччивания
:Поссылке
set /p url="Вставь скопированную ссыль (ctrl+v): "
ffmpeg -y -i "%url%" -c: v libx265 -c: copy -flags + global_header "out\%time%-%date%.mp4"
rem старая настройка ffmpeg -y -i "%url%" -vn -ar 44100 -ac 2 -ab 192k -f mp3 "out\%time%-%date%.mp4"
if errorlevel 1 youtube-dl -o "out/%%(title)s.%%(ext)s" -f best "%url%"
rem ffplay "out/%(title)s.%(ext)s"

rem cls
goto end
rem ####### Конец скачивания

rem ####### Cкачать по ссылке отрывок
set /p url="Вставь скопированную ссыль (ctrl+v):______"
set /p ss="Введи начало записи вида 1:10:20 (1час:10минут:20секунд):_______"
set /p t="Введи продолжительность записи вида 0:00:20 (Скачается 20):_______"
ffmpeg -ss %ss% -i %url% -t %t% -c:v copy -bsf:a aac_adtstoasc "out\%date%-%time%.mp4"
goto end
rem ####### конец скачивания

:4
youtube-dl -o "out/%%(title)s-%%(id)s-%%(upload_date)s-%date%-%time%.%%(ext)s" -c --batch-file z-----list-youtube.txt
goto end
rem ####### Конец скачивания


:: Завершение программы
:end
if %errorlevel%==1 (pause & cls & goto Гменю)
echo  & start out & cls

echo                        *****************************
echo                        *-----РАБОТА ЗАВЕРШЕНА.-----*
echo                        *ОТКРЫТА ПАПКА С РЕЗУЛЬТАТОМ*
echo                        *-----РАБОТА ЗАВЕРШЕНА.-----*
echo                        *****************************
goto Гменю


::заготовка.
%цикл% ffmpeg %in% -vf %vf1%,%vf2%,%vf3%    %out%)

:: двухпроходное кодирование v9 EXAPLE
ffmpeg -i <source> -c:v libvpx-vp9 -pass 1 -b:v 1000K -threads 1 -speed 4 \
  -tile-columns 0 -frame-parallel 0 \
  -g 9999 -aq-mode 0 -an -f webm /dev/null


ffmpeg -i <source> -c:v libvpx-vp9 -pass 2 -b:v 1000K -threads 1 -speed 0 \
  -tile-columns 0 -frame-parallel 0 -auto-alt-ref 1 -lag-in-frames 25 \
  -g 9999 -aq-mode 0 -c:a libopus -b:a 64k -f webm out.webm

Ребята спасибо. Я, как бы сказать, работаю и времени не так много на полноценное изучение. Досканальное изучение. Меня хватает ровно на столько, на сколько хватает. В силу своих возможностей по тихотьку и изучаю. Знаю что такое гугл. Рылся и роюсь до сих пор в нэте в изучении. Читал мануалы и русские, и английские. Пытаюсь вчитываться, но много трудных по смыслу слов, понятий. Всё это интересно и заставляет извилины шевелиться. Я сижу за этим делом по часу в день, а то и в неделю. Вот сегодня было очень интересно. Спасибо.


Время: 06:24.

Время: 06:24.
© OSzone.net 2001-