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

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

Sisin 18-12-2017 11:21 2785150

Комментарий внутри цикла 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"
)

т.е. я не хочу удалять строки, а лишь убрать из цикла для моего удобства.

megaloman 18-12-2017 11:28 2785154

Sisin, имхо, двоеточие- это метка, а комментарий начинается rem c пробелом

Sisin 18-12-2017 11:30 2785155

Цитата:

Цитата megaloman
Sisin, имхо, двоеточие- это метка, а комментарий начинается rem c пробелом »

с rem тоже не работает.

Iska 18-12-2017 11:41 2785159

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

И с чего бы ей исполняться?!

Sisin 18-12-2017 12:18 2785166

А можно как-то извратиться, чтобы аргументы для ffmpeg.exe передавались построчно, но так, чтобы между строчек можно было бы вставлять комментарии???

Iska 18-12-2017 12:39 2785170

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


Sisin 18-12-2017 12:55 2785176

Цитата:

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


Iska 18-12-2017 13:18 2785180

Цитата:

Цитата 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 и не мучаться, не?!

Sisin 18-12-2017 13:39 2785186

Цитата:

Цитата Iska
P.S. Может, Вам проще будет взять одну из многочисленных GUI-оболочек для ffmpeg.exe и не мучаться, не?! »

Просто полный скрипт еще больше, а в нем используется 4 программы. GUI-оболочка не поможет, вернее поможет, но их будет 4, плюс ненужные телодвижения.

Iska 18-12-2017 13:45 2785187

Ну, тогда так:
Цитата:

Цитата Iska
формировать командную строку отдельно, »

попробуйте, может сгодится.

Sisin 18-12-2017 13:57 2785193

Цитата:

Цитата Iska
попробуйте, может сгодится. »


Iska 18-12-2017 14:15 2785196

Sisin, ?!

Sisin 18-12-2017 14:22 2785199

Цитата:

Цитата Iska
Sisin, ?! »

Глупость написал. Думал можно каретке указать не читать следующую строку.

megaloman 18-12-2017 20:22 2785269

Цитата:

Цитата 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 перед вызовом Ваших программ написал для отладки, так как их у меня нет.

Sisin 19-12-2017 12:09 2785421

Цитата:

Цитата megaloman
Вам надо извращений? Их есть у меня! :) »

Сударь, Вы знаете толк в извращениях)))

Sisin 19-12-2017 13:15 2785466

Подправленный и работающий
Код:

@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 как мне надо, иначе ошибка.
Можно ли как-то выкрутиться??

Iska 19-12-2017 13:35 2785479

Цитата:

Цитата Sisin
я не могу назвать файл bat как мне надо »

А как Вам надо?

Цитата:

Цитата Sisin
иначе ошибка. »

Какая?

Sisin 19-12-2017 13:45 2785486

Цитата:

Цитата Iska
А как Вам надо? »

1 - MKV, MP4, WMV to MKV (COPY2).bat

Цитата:

Цитата Iska
Какая? »

Непредвиденное появление: .bat""'>.

Iska 19-12-2017 14:12 2785498

Sisin, попробуйте не использовать круглых скобок в имени пакетного файла.

Sisin 19-12-2017 14:27 2785506

Цитата:

Цитата Iska
Sisin, попробуйте не использовать круглых скобок в имени пакетного файла. »

Помогло. Заменил на квадратные. Работает. А чем это вызвано??

Iska 19-12-2017 14:33 2785508

Цитата:

Цитата 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 …».

Sisin 19-12-2017 14:48 2785514

Короче, погонял пакетный файл. Нормально работает если название без пробелов.
Если с пробелами или знаками, то ffmpeg просто начинает конвертирование без учета указанных параметров.

Iska 19-12-2017 14:51 2785516

Цитата:

Цитата Sisin
При детальном изучении квадратная скобка тоже косячит. Пакетный файл работает, но параметры не считываются. »

Может быть, я детально код не смотрел.

P.S. Вот за такие вещи я и не люблю пакетные файлы и PowerShell.


Время: 04:32.

Время: 04:32.
© OSzone.net 2001-