Комментарий внутри цикла FOR
Как сделать, чтобы комментарий в цикле FOR не мешал работе:
Код:
for %%a in (*.mkv;*.mp4;*.wmv) do (
ffmpeg -i "%%~a" ^
-c:v copy ^
-c:a copy ^
:: Начало обрезки:
:: -ss 00:08:38 ^
:: Продолжительность обрезки:
:: -t 00:05:00 ^
"fix\%%~na.mkv"
)
т.е. я не хочу удалять строки, а лишь убрать из цикла для моего удобства.
|
Sisin, имхо, двоеточие- это метка, а комментарий начинается rem c пробелом
|
Цитата:
Цитата megaloman
Sisin, имхо, двоеточие- это метка, а комментарий начинается rem c пробелом »
|
с rem тоже не работает.
|
Sisin, комментарии не могут располагаться внутри строки команд. А у Вас, как было верно замечено, даже не комментарии. Впрочем, если бы были и комментарии — то тоже не могут. Уберите переносы и что выйдет?
Код:
for %%a in (*.mkv;*.mp4;*.wmv) do (
ffmpeg.exe -i "%%~a" -c:v copy -c:a copy :: Начало обрезки::: -ss 00:08:38 :: Продолжительность обрезки::: -t 00:05:00 "fix\%%~na.mkv"
)
И с чего бы ей исполняться?!
|
А можно как-то извратиться, чтобы аргументы для ffmpeg.exe передавались построчно, но так, чтобы между строчек можно было бы вставлять комментарии???
|
Sisin, это не между строчек, понимаете? Это внутри одной строки. Никак Вы не вставите комментарий внутрь команды.
Я так понимаю, Вы комментарии вставляете не из любви к искусству, а для памяти, дабы не запоминать имена параметров, и за что каждый из них отвечает, да? Тогда предлагаю воспользоваться, например, следующим способом:
Скрытый текст
Код:
@echo off
setlocal enableextensions enabledelayedexpansion
rem Начало обрезки:
set sStartTime=00:08:38
rem Продолжительность обрезки:
set sPeriod=00:05:00
for %%a in (*.mkv;*.mp4;*.wmv) do (
ffmpeg.exe ^
-i "%%~a" ^
-c:v copy ^
-c:a copy ^
-ss %sStartTime% ^
-t %sPeriod% ^
"fix\%%~na.mkv"
)
endlocal
exit /b 0
|
Цитата:
Цитата Iska
Я так понимаю, Вы комментарии вставляете не из любви к искусству, а для памяти, дабы не запоминать имена параметров, и за что каждый из них отвечает, да? »
|
Да, но дело в том, что два параметра я могу запомнить (я их указал в качестве примера для ffmpeg) )))
Вот другой НЕРАБОТАЮЩИЙ пример:
Пример
Код:
for %%a in (fix\*.mkv) do (
::Настройка по умолчанию для 1 видео и 1 аудио дорожек
mkvmerge -o "fixed\%%~nxa" ^
rem Распознавание дорожек:
rem -d 0 -a 1,2 -s 3
-d 0 a 1 -S -T ^
--track-name 0:"" ^
--track-name 1:"" ^
rem--track-name 2:"" ^
--language 0:und ^
--language 1:rus ^
rem --language 2:rus ^
--default-track 0:yes ^
--default-track 1:yes ^
rem --default-track 2:no ^
--forced-track 0:no ^
--forced-track 1:no ^
rem --forced-track 2:no ^
--compression 0:none ^
--compression 1:none ^
rem --compression 2:none ^
--title "" ^
rem Очередность дорожек:
rem --track-order 0:0,0:1,0:2,0:3
--track-order 0:0,0:1 ^
--no-global-tags ^
--no-chapters ^
--disable-track-statistics-tags ^
"%%~a"
)
Мне удобнее было бы не удалять строчки, а отключать.
Сейчас у меня комментарии расположены отдельно и приходится их переносить с места на место.
Так сейчас
Код:
for %%a in (fix\*.mkv) do (
::Настройка по умолчанию для 1 видео и 1 аудио дорожек
mkvmerge -o "fixed\%%~nxa" ^
-d 0 a 1 -S -T ^
--track-name 0:"" ^
--track-name 1:"" ^
--language 0:und ^
--language 1:rus ^
--default-track 0:yes ^
--default-track 1:yes ^
--forced-track 0:no ^
--forced-track 1:no ^
--compression 0:none ^
--compression 1:none ^
--title "" ^
--track-order 0:0,0:1 ^
--no-global-tags ^
--no-chapters ^
--disable-track-statistics-tags ^
"%%~a"
)
rem -d 0 -a 1,2 -s 3
rem -d 0 a 1 -S -T
rem --track-name 0:""
rem --track-name 1:""
rem--track-name 2:""
rem --language 0:und
rem --language 1:rus
rem --language 2:rus
rem --default-track 0:yes
rem --default-track 1:yes
rem --default-track 2:no
rem --forced-track 0:no
rem --forced-track 1:no
rem --forced-track 2:no
rem --compression 0:none
rem --compression 1:none
rem --compression 2:none
rem --title ""
rem --track-order 0:0,0:1,0:2,0:3
rem --track-order 0:0,0:1
rem --no-global-tags
rem --no-chapters
rem --disable-track-statistics-tags
|
Цитата:
Цитата Sisin
Мне удобнее было бы не удалять строчки, а отключать. »
|
Как я Вас понимаю :). Но увы, фокус не удастся. Максимум, что Вы можете сделать — формировать командную строку отдельно, наподобие:
Скрытый текст
Код:
@echo off
setlocal enableextensions enabledelayedexpansion
set sArguments=
rem Начало обрезки:
set sArguments=%sArguments% -ss 00:08:38
rem Продолжительность обрезки:
set sArguments=%sArguments% -t 00:05:00
for %%a in (*.mkv;*.mp4;*.wmv) do (
ffmpeg.exe ^
-i "%%~a" ^
-c:v copy ^
-c:a copy ^
%sArguments% ^
"fix\%%~na.mkv"
)
endlocal
exit /b 0
и при нужде Вы просто комментируете/раскомментируете тот или иной аргумент.
P.S. Может, Вам проще будет взять одну из многочисленных GUI-оболочек для ffmpeg.exe и не мучаться, не?!
|
Цитата:
Цитата Iska
P.S. Может, Вам проще будет взять одну из многочисленных GUI-оболочек для ffmpeg.exe и не мучаться, не?! »
|
Просто полный скрипт еще больше, а в нем используется 4 программы. GUI-оболочка не поможет, вернее поможет, но их будет 4, плюс ненужные телодвижения.
|
Ну, тогда так:
Цитата:
Цитата Iska
формировать командную строку отдельно, »
|
попробуйте, может сгодится.
|
Цитата:
Цитата Iska
попробуйте, может сгодится. »
|
|
Глупость написал. Думал можно каретке указать не читать следующую строку.
|
Цитата:
Цитата Sisin
А можно как-то извратиться »
|
Вам надо извращений? Их есть у меня! :)
Код:
@Echo Off
cls
SetLocal EnableExtensions EnableDelayedExpansion
Call :Parameters ":Inmkvmerge" "Pmkv"
For %%a in (fix\*.mkv) do Echo mkvmerge -o "fixed\%%~nxa"%Pmkv% "%%~a"
Call :Parameters ":Inffmpeg" "Pffm"
for %%a in (*.mkv;*.mp4;*.wmv) Do Echo ffmpeg -i "%%~a"%Pffm% "fix\%%~na.mkv"
pause
GoTo :Eof
:Parameters
For /F "usebackq tokens=1* delims=:" %%a In (`"FINDSTR /B /L /I /N /C:%1 "%~dpnx0""`) DO Set /A Nbeg=%%a
Set "%~2="
For /F "usebackq tokens=1,* delims=~" %%a In (`"more +%Nbeg% "%~dpnx0""`) DO (
If /I "%%a"=="GoTo :Eof" GoTo :Eof
If Not "%%a"==":" Set "%~2=!%~2! %%a"
)
GoTo :Eof
:Inffmpeg
-c:v copy
-c:a copy
:~ Начало обрезки:
:~ -ss 00:08:38
:~ Продолжительность обрезки:
:~-t 00:05:00
GoTo :Eof
:Inmkvmerge
:~Настройка по умолчанию для 1 видео и 1 аудио дорожек
:~ Распознавание дорожек:
:~-d 0 -a 1,2 -s 3
-d 0 a 1 -S -T
--track-name 0:""
--track-name 1:""
:~--track-name 2:""
--language 0:und
--language 1:rus
:~--language 2:rus
--default-track 0:yes
--default-track 1:yes
:~--default-track 2:no
--forced-track 0:no
--forced-track 1:no
:~--forced-track 2:no
--compression 0:none
--compression 1:none
:~--compression 2:none
--title ""
:~ Очередность дорожек:
:~--track-order 0:0,0:1,0:2,0:3
--track-order 0:0,0:1
--no-global-tags
--no-chapters
--disable-track-statistics-tags
GoTo :Eof
Идея работы:
Перечислить все параметры построчно в отдельной секции и на их основе сформировать строку параметров.
Я придумал для секции способ комментирования: символы :~
Сначала вызываем формирование параметров, а затем уже цикл по вашим файлам.
Echo перед вызовом Ваших программ написал для отладки, так как их у меня нет.
|
Цитата:
Цитата megaloman
Вам надо извращений? Их есть у меня! :) »
|
Сударь, Вы знаете толк в извращениях)))
|
Подправленный и работающий
Код:
@Echo Off
md fix
cls
SetLocal EnableExtensions EnableDelayedExpansion
Call :Parameters ":Inffmpeg" "Pffm"
for %%a in (*.mkv;*.mp4;*.wmv) do ffmpeg -i "%%~a"%Pffm% "fix\%%~na.mkv"
Call :Parameters ":Inmkvmerge" "Pmkv"
for %%a in (fix\*.mkv) do mkvmerge -o "fixed\%%~nxa"%Pmkv% "%%~a"
del /q fix
rd /q fix
pause
GoTo :Eof
:Parameters
For /F "usebackq tokens=1* delims=:" %%a In (`"FINDSTR /B /L /I /N /C:%1 "%~dpnx0""`) DO Set /A Nbeg=%%a
Set "%~2="
For /F "usebackq tokens=1,* delims=~" %%a In (`"more +%Nbeg% "%~dpnx0""`) DO (
If /I "%%a"=="GoTo :Eof" GoTo :Eof
If Not "%%a"==":" Set "%~2=!%~2! %%a"
)
GoTo :Eof
:Inffmpeg
-c:v copy
-c:a copy
:~ Начало обрезки:
:~ -ss 00:08:38
:~ Продолжительность обрезки:
:~ -t 00:05:00
GoTo :Eof
:Inmkvmerge
:~ Настройка по умолчанию для 1 видео и 1 аудио дорожек
:~ Распознавание дорожек:
:~ -d 0 -a 1,2 -s 3
-d 0 -a 1 -S -T
--track-name 0:""
--track-name 1:""
:~ --track-name 2:""
--language 0:und
--language 1:rus
:~ --language 2:rus
--default-track 0:yes
--default-track 1:yes
:~ --default-track 2:no
--forced-track 0:no
--forced-track 1:no
:~ --forced-track 2:no
--compression 0:none
--compression 1:none
:~ --compression 2:none
--title ""
:~ Очередность дорожек:
:~ --track-order 0:0,0:1,0:2,0:3
--track-order 0:0,0:1
--no-global-tags
--no-chapters
--disable-track-statistics-tags
GoTo :Eof
Есть одно НО, я не могу назвать файл bat как мне надо, иначе ошибка.
Можно ли как-то выкрутиться??
|
Цитата:
Цитата Sisin
я не могу назвать файл bat как мне надо »
|
А как Вам надо?
Какая?
|
1 - MKV, MP4, WMV to MKV (COPY2).bat
Непредвиденное появление: .bat""'>.
|
Sisin, попробуйте не использовать круглых скобок в имени пакетного файла.
|
Цитата:
Цитата Iska
Sisin, попробуйте не использовать круглых скобок в имени пакетного файла. »
|
Помогло. Заменил на квадратные. Работает. А чем это вызвано??
|
Цитата:
Цитата Sisin
Помогло. Заменил на квадратные. Работает. А чем это вызвано?? »
|
Тем, что в пакетных файлах отсутствует понятие строковой лексемы как отдельной сущности, потому вот здесь:
Код:
:Parameters
For /F "usebackq tokens=1* delims=:" %%a In (`"FINDSTR /B /L /I /N /C:%1 "%~dpnx0""`) DO Set /A Nbeg=%%a
Set "%~2="
For /F "usebackq tokens=1,* delims=~" %%a In (`"more +%Nbeg% "%~dpnx0""`) DO (
If /I "%%a"=="GoTo :Eof" GoTo :Eof
If Not "%%a"==":" Set "%~2=!%~2! %%a"
)
GoTo :Eof
переменная %0 разворачивается «как есть», и наличествующие в имени пакетного файла круглые скобки сводят лексический анализатор с ума — он начинает воспринимать закрывающую круглую скобку из имени файла как закрывающую скобку в наборе «in (… ) do …».
|
Короче, погонял пакетный файл. Нормально работает если название без пробелов.
Если с пробелами или знаками, то ffmpeg просто начинает конвертирование без учета указанных параметров.
|
Цитата:
Цитата Sisin
При детальном изучении квадратная скобка тоже косячит. Пакетный файл работает, но параметры не считываются. »
|
Может быть, я детально код не смотрел.
P.S. Вот за такие вещи я и не люблю пакетные файлы и PowerShell.
|
Время: 04:32.
© OSzone.net 2001-