PDA

Показать полную графическую версию : [решено] сравнить строки в текстовых файлах


Страниц : [1] 2

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

Iska
24-10-2020, 20:08
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, прошу, напишите в коде комментарии.

Iska
25-10-2020, 15:45
Konstantinkn, к сожалению, пакетные файлы поддерживают ограниченное комментирование. Но Вы можете спросить, ежели что-то непонятно конкретное.

Konstantinkn
25-10-2020, 17:47
Konstantinkn, к сожалению, пакетные файлы поддерживают ограниченное комментирование. Но Вы можете спросить, ежели что-то непонятно конкретное. »

Ясно. Спасибо, Iska.

А как сделать, чтобы в дополнение к Вашему решению происходило так:

3. Если все строки совпадают, bat-файл создаёт текстовый файл report.txt, и в нём написано: различий нет.
4. Если какие-либо строки различаются, bat-файл создаёт текстовый файл report.txt, и в нём написано: есть следующие различия: у файла file2.mp4 отличаются следующие строки: и список строк из файла file2.mp4, которые отличаются от строк файла file1.mp4

Iska
25-10-2020, 22:24
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 основного блока

Iska
25-10-2020, 23:46
greg zakharov, флаг в руки, коллега, флаг в руки ;). Но лукавите Вы, именуя комментариями то, что ими не является. И Вы сие знаете.

greg zakharov
26-10-2020, 07:46
Iska, что именно не является комментарием? Всё приведенное - комментарии, только похоже вы об этом не знали. Жаль, жаль...

Elven
26-10-2020, 08:50
greg zakharov, rem или :: предназначены как раз для комментирования, здесь не спорю, а вот насчет других способова - соглашусь с Iska. Это как с холодным оружием: "Является холодным оружием" и "Может быть использовано в качестве холодного оружия" - разные вещи. Так же и тут, обычные строки могут быть использованы в качестве комментария будучи вырезаны из выполнения посредством безусловного перехода или отделены посредством eixt /b, но сами по себе они не являются комментариями. в противном случае нижеприведенный фрагмент тоже можно считать комментарием:

echo "Здесь мог быть ваш комментарий" > NUL

greg zakharov
26-10-2020, 14:47
Elven, представьте, вы идёте по дороге, перед вами куча дерьма. Что изменится, если вы назовете оную экскрементами? Ничего.
С технической точки зрения всё, что не обрабатывается анализатором\интерпретатором\компилятором есть ни что иное как комментарий, поэтому приведённый вами пример является таковым.

Elven
26-10-2020, 16:01
Не буду спорить, вижу что бесполезно. Но это все равно нецелевое использование операторов. На компиляторы/анализаторы/интерпретаторы можно сколь угодно ссылаться, но всегда есть какое-нибудь "но".
"Для компилятора нет разницы, чем отступы делать - пробелами или табуляцией. А можно вообще никаких отступов не делать, ведь работает!" - а потом приходит yaml и сторонники таких утверждений начинают страдать.

DJ Mogarych
26-10-2020, 16:02
Elven, не спорьте с greg zakharov, это совершенно бессмысленно.

greg zakharov
26-10-2020, 16:34
Elven, а сколько "нецелевого" кода написано на форуме (этом и прочем), но никто против не высказывается. Да и где они, критерии "целевого"? Ну а коли вы приплели сюда YAML, позвольте со своей строны затронуть pwsh, точнее рефлексию: с практической точки зрения выгоды от нее сложно переоценить, а вот пользоваться ей не спешат, - это же не значит, что рефлексии нет или пользоваться ей опасно, верно?
DJ Mogarych, а вы в суть хотя бы пытались вникнуть или как и прежде "я - модератор, а значит заведомо прав"?

Iska
27-10-2020, 22:03
Всё приведенное - комментарии, »
Нет.

только похоже вы об этом не знали. Жаль, жаль... »
Я знаю, что не являются. И Вы отлично знаете, что не являются.

Elven, комментарием является только и исключительно REM. «::», равно, как описанное выше коллегой greg zakharov'ым, комментариями, с точки зрения интерпретатора команд cmd.exe, не являются.

С технической точки зрения всё, что не обрабатывается анализатором\интерпретатором\компилятором есть ни что иное как комментарий, поэтому приведённый вами пример является таковым. »
Как раз с технической точки зрения — комментарий обрабатывается.

Elven, не спорьте с greg zakharov, это совершенно бессмысленно. »
Это точно :).

DJ Mogarych, а вы в суть хотя бы пытались вникнуть или как и прежде "я - модератор, а значит заведомо прав"? »
«И ты прав, ученик»™ ;).

Fors1k
28-10-2020, 02:41
Если у кого-то личные счеты с 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))

Iska
29-10-2020, 02:14
Fors1k, тогда уж цитируйте целиком.

P.S. И какие тут могут быть «личные счёты»?! Вы вообще о чём?!

YuS_2
29-10-2020, 08:34
О чем спор, собственно?
В каждом интерпретаторе, компиляторе должен быть задокументированный перечень команд, комментариев и т.п.. Всё, что не описано, не является синтаксически верным и может быть изменено в любой момент без какого-либо предупреждения.
Следовательно, с точки зрения логики, для командного интерпретатора cmd.exe есть только один вид однострочных комментариев - REM, всё остальное - незадокументированные фичи, которые при некотором сочетании факторов, могут привести к непредсказуемым результатам тчк

Iska
29-10-2020, 17:42
Именно! И комментарий таки обрабатывается тем или иным обработчиком, будь то интерпретатор команд, або транслятор/компилятор. И именно после обработки обработчик «понимает», что именно он должен игнорировать.

sov44
29-10-2020, 18:27
Iska лукавит, ему просто влом расписывать написанное. »
Как-то все отошли от темы. Может кому-то не влом?




© OSzone.net 2001-2012