Показать полную графическую версию : [решено] сравнить строки в текстовых файлах
Konstantinkn
24-10-2020, 17:34
Прошу, помогите написать bat-файл. Хочу сравнить строки в текстовых файлах.
Что есть? Папка. В ней два файла MP4: file1.mp4, file2.mp4. Цель - выяснить, совпадают ли у этих MP4 значения всех параметров, или есть различия?
Параметры и значения, например, следующие:
codec_name=h264
has_b_frames=1
pix_fmt=yuv420p
Инструмент для получения сведений о файлах - ffprobe. https://ffmpeg.org/ffprobe.html
ffprobe работает из командной строки. Синтаксис ffprobe, например, следующий: ffprobe -v 32 -print_format default -show_format -show_streams -hide_banner file1.mp4
Хочу, чтобы в bat-файле был следующий алгоритм.
1. bat-файл запускает ffprobe по каждому из двух файлов. bat-файл по каждому из двух файлов в папке создаёт текстовый файл и выводит в него информацию о параметрах и значениях. Одна строка - одна пара параметр-значение. Название текстового файла совпадает с названием MP4, отличается расширение: file1.txt, file2.txt
2. bat-файл сравнивает каждую строку.
3. Если все строки совпадают, bat-файл создаёт текстовый файл report.txt, и в нём написано: различий нет.
4. Если какие-либо строки различаются, bat-файл создаёт текстовый файл report.txt, и в нём написано: есть следующие различия: у файла file2.mp4 отличаются следующие строки: и список строк из файла file2.mp4, которые отличаются от строк файла file1.mp4
Konstantinkn, тогда уж тупо пользовать какой-нибудь WinMerge:
@echo off
setlocal enableextensions enabledelayedexpansion
set sSourceFile01=%~1
set sSourceFile02=%~2
if not defined sSourceFile01 (
echo Usage: "%~nx0" ^<Source file 1^> ^<Source file 2^>
exit /b 1
) else (
if not defined sSourceFile02 (
echo Usage: "%~nx0" ^<Source file 1^> ^<Source file 2^>
exit /b 1
) else (
if not exist "%sSourceFile01%" (
echo Not found source file [%sSourceFile01%].
exit /b 2
) else (
if not exist "%sSourceFile02%" (
echo Not found source file [%sSourceFile02%].
exit /b 2
)
)
)
)
set sPath2FFProbe=%ProgramFiles%\FFmpeg\bin\ffprobe.exe
set sFFProbeParameters=-v 32 -print_format default -show_format -show_streams -hide_banner
set sPath2WinMerge=%ProgramFiles(x86)%\WinMerge\WinMergeU.exe
set sLeftFile=%Temp%\LeftFile.txt
set sRightFile=%Temp%\RightFile.txt
>"%sLeftFile%" "%sPath2FFProbe%" %sFFProbeParameters% "%sSourceFile01%"
>"%sRightFile%" "%sPath2FFProbe%" %sFFProbeParameters% "%sSourceFile02%"
"%sPath2WinMerge%" /e /u /wl /wr /maximize "%sLeftFile%" "%sRightFile%"
>nul del /f /q "%sLeftFile%" "%sRightFile%"
endlocal
exit /b 0
https://i.imgur.com/v3ey08D.png
Konstantinkn
25-10-2020, 11:41
Iska, спасибо. Взял в изучение.
Iska, прошу, напишите в коде комментарии.
Konstantinkn, к сожалению, пакетные файлы поддерживают ограниченное комментирование. Но Вы можете спросить, ежели что-то непонятно конкретное.
Konstantinkn
25-10-2020, 17:47
Konstantinkn, к сожалению, пакетные файлы поддерживают ограниченное комментирование. Но Вы можете спросить, ежели что-то непонятно конкретное. »
Ясно. Спасибо, Iska.
А как сделать, чтобы в дополнение к Вашему решению происходило так:
3. Если все строки совпадают, bat-файл создаёт текстовый файл report.txt, и в нём написано: различий нет.
4. Если какие-либо строки различаются, bat-файл создаёт текстовый файл report.txt, и в нём написано: есть следующие различия: у файла file2.mp4 отличаются следующие строки: и список строк из файла file2.mp4, которые отличаются от строк файла file1.mp4
Konstantinkn, сделать можно. Но не вижу практического смысла.
greg zakharov
25-10-2020, 22:42
к сожалению, пакетные файлы поддерживают ограниченное комментирование
Konstantinkn, Iska лукавит, ему просто влом расписывать написанное.
@echo off
setlocal
rem традиционный комментарий
set "var=переменная" % rem это послестрочный комментарий
goto:end_comment
а это многострочный комментарий
ограниченный инструкцией goto и меткой end_comment
:end_comment
endlocal
exit /b
внеблочные комментарии могут быть размещены в любом месте
после инструкции exit /b основного блока
greg zakharov, флаг в руки, коллега, флаг в руки ;). Но лукавите Вы, именуя комментариями то, что ими не является. И Вы сие знаете.
greg zakharov
26-10-2020, 07:46
Iska, что именно не является комментарием? Всё приведенное - комментарии, только похоже вы об этом не знали. Жаль, жаль...
greg zakharov, rem или :: предназначены как раз для комментирования, здесь не спорю, а вот насчет других способова - соглашусь с Iska. Это как с холодным оружием: "Является холодным оружием" и "Может быть использовано в качестве холодного оружия" - разные вещи. Так же и тут, обычные строки могут быть использованы в качестве комментария будучи вырезаны из выполнения посредством безусловного перехода или отделены посредством eixt /b, но сами по себе они не являются комментариями. в противном случае нижеприведенный фрагмент тоже можно считать комментарием:
echo "Здесь мог быть ваш комментарий" > NUL
greg zakharov
26-10-2020, 14:47
Elven, представьте, вы идёте по дороге, перед вами куча дерьма. Что изменится, если вы назовете оную экскрементами? Ничего.
С технической точки зрения всё, что не обрабатывается анализатором\интерпретатором\компилятором есть ни что иное как комментарий, поэтому приведённый вами пример является таковым.
Не буду спорить, вижу что бесполезно. Но это все равно нецелевое использование операторов. На компиляторы/анализаторы/интерпретаторы можно сколь угодно ссылаться, но всегда есть какое-нибудь "но".
"Для компилятора нет разницы, чем отступы делать - пробелами или табуляцией. А можно вообще никаких отступов не делать, ведь работает!" - а потом приходит yaml и сторонники таких утверждений начинают страдать.
DJ Mogarych
26-10-2020, 16:02
Elven, не спорьте с greg zakharov, это совершенно бессмысленно.
greg zakharov
26-10-2020, 16:34
Elven, а сколько "нецелевого" кода написано на форуме (этом и прочем), но никто против не высказывается. Да и где они, критерии "целевого"? Ну а коли вы приплели сюда YAML, позвольте со своей строны затронуть pwsh, точнее рефлексию: с практической точки зрения выгоды от нее сложно переоценить, а вот пользоваться ей не спешат, - это же не значит, что рефлексии нет или пользоваться ей опасно, верно?
DJ Mogarych, а вы в суть хотя бы пытались вникнуть или как и прежде "я - модератор, а значит заведомо прав"?
Всё приведенное - комментарии, »
Нет.
только похоже вы об этом не знали. Жаль, жаль... »
Я знаю, что не являются. И Вы отлично знаете, что не являются.
Elven, комментарием является только и исключительно REM. «::», равно, как описанное выше коллегой greg zakharov'ым, комментариями, с точки зрения интерпретатора команд cmd.exe, не являются.
С технической точки зрения всё, что не обрабатывается анализатором\интерпретатором\компилятором есть ни что иное как комментарий, поэтому приведённый вами пример является таковым. »
Как раз с технической точки зрения — комментарий обрабатывается.
Elven, не спорьте с greg zakharov, это совершенно бессмысленно. »
Это точно :).
DJ Mogarych, а вы в суть хотя бы пытались вникнуть или как и прежде "я - модератор, а значит заведомо прав"? »
«И ты прав, ученик»™ ;).
Если у кого-то личные счеты с greg zakharov, то не стоит приплетать их к делу. Устроенная карусель из поддакиваний друг другу истину не отменит.
Комментарий - это пояснение, которое находится внутри комментируемого кода, и не оказывает никакого влияния на результат компиляции программы или её интерпретацию. (https://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BC%D0%BC%D0%B5%D0%BD%D1%82%D0%B0%D1%80%D0%B8%D0%B8_(%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D 0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5))
Fors1k, тогда уж цитируйте целиком.
P.S. И какие тут могут быть «личные счёты»?! Вы вообще о чём?!
О чем спор, собственно?
В каждом интерпретаторе, компиляторе должен быть задокументированный перечень команд, комментариев и т.п.. Всё, что не описано, не является синтаксически верным и может быть изменено в любой момент без какого-либо предупреждения.
Следовательно, с точки зрения логики, для командного интерпретатора cmd.exe есть только один вид однострочных комментариев - REM, всё остальное - незадокументированные фичи, которые при некотором сочетании факторов, могут привести к непредсказуемым результатам тчк
Именно! И комментарий таки обрабатывается тем или иным обработчиком, будь то интерпретатор команд, або транслятор/компилятор. И именно после обработки обработчик «понимает», что именно он должен игнорировать.
Iska лукавит, ему просто влом расписывать написанное. »
Как-то все отошли от темы. Может кому-то не влом?
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.