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

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

Konstantinkn 24-10-2020 17:34 2937425

сравнить строки в текстовых файлах
 
Прошу, помогите написать 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 2937439

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



Konstantinkn 25-10-2020 11:41 2937492

Iska, спасибо. Взял в изучение.

Iska, прошу, напишите в коде комментарии.

Iska 25-10-2020 15:45 2937519

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

Konstantinkn 25-10-2020 17:47 2937527

Цитата:

Цитата Iska
Konstantinkn, к сожалению, пакетные файлы поддерживают ограниченное комментирование. Но Вы можете спросить, ежели что-то непонятно конкретное. »

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

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

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

Iska 25-10-2020 22:24 2937547

Konstantinkn, сделать можно. Но не вижу практического смысла.

greg zakharov 25-10-2020 22:42 2937551

Цитата:

Цитата Iska
к сожалению, пакетные файлы поддерживают ограниченное комментирование

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 2937556

greg zakharov, флаг в руки, коллега, флаг в руки ;). Но лукавите Вы, именуя комментариями то, что ими не является. И Вы сие знаете.

greg zakharov 26-10-2020 07:46 2937572

Iska, что именно не является комментарием? Всё приведенное - комментарии, только похоже вы об этом не знали. Жаль, жаль...

Elven 26-10-2020 08:50 2937574

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

Код:

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

greg zakharov 26-10-2020 14:47 2937620

Elven, представьте, вы идёте по дороге, перед вами куча дерьма. Что изменится, если вы назовете оную экскрементами? Ничего.
С технической точки зрения всё, что не обрабатывается анализатором\интерпретатором\компилятором есть ни что иное как комментарий, поэтому приведённый вами пример является таковым.

Elven 26-10-2020 16:01 2937628

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

DJ Mogarych 26-10-2020 16:02 2937629

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

greg zakharov 26-10-2020 16:34 2937634

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

Iska 27-10-2020 22:03 2937819

Цитата:

Цитата greg zakharov
Всё приведенное - комментарии, »

Нет.

Цитата:

Цитата greg zakharov
только похоже вы об этом не знали. Жаль, жаль... »

Я знаю, что не являются. И Вы отлично знаете, что не являются.

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

Цитата:

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

Как раз с технической точки зрения — комментарий обрабатывается.

Цитата:

Цитата DJ Mogarych
Elven, не спорьте с greg zakharov, это совершенно бессмысленно. »

Это точно :).

Цитата:

Цитата greg zakharov
DJ Mogarych, а вы в суть хотя бы пытались вникнуть или как и прежде "я - модератор, а значит заведомо прав"? »

«И ты прав, ученик»™ ;).

Fors1k 28-10-2020 02:41 2937831

Если у кого-то личные счеты с greg zakharov, то не стоит приплетать их к делу. Устроенная карусель из поддакиваний друг другу истину не отменит.
Комментарий - это пояснение, которое находится внутри комментируемого кода, и не оказывает никакого влияния на результат компиляции программы или её интерпретацию.

Iska 29-10-2020 02:14 2937987

Fors1k, тогда уж цитируйте целиком.

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

YuS_2 29-10-2020 08:34 2938000

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

Iska 29-10-2020 17:42 2938065

Именно! И комментарий таки обрабатывается тем или иным обработчиком, будь то интерпретатор команд, або транслятор/компилятор. И именно после обработки обработчик «понимает», что именно он должен игнорировать.

sov44 29-10-2020 18:27 2938075

Цитата:

Цитата greg zakharov
Iska лукавит, ему просто влом расписывать написанное. »

Как-то все отошли от темы. Может кому-то не влом?

Iska 29-10-2020 19:01 2938082

sov44, мне не «в лом», как предположил коллега greg zakharov. Но что там расписывать? Код прост, как пробка. Никаких конкретных вопросов по коду задано не было.

DJ Mogarych 30-10-2020 09:57 2938148

Powershell:
Код:

$a = & ffprobe -hide_banner -select_streams v -show_streams -v error -i "D:\Видео\1.mp4" |select-string codec_name,has_b_frames,pix_fmt
$b = & ffprobe -hide_banner -select_streams v -show_streams -v error -i "D:\Видео\2.mp4" |select-string codec_name,has_b_frames,pix_fmt

diff $a $b

Вывод допилите как вам нужно.

Konstantinkn 13-04-2021 11:52 2955647

Спасибо всем за Ваши ответы.

Хочу вернуться к этой теме.

Я сделал bat-файл.
Код:

ffprobe -v 32 -print_format default -show_format -show_streams -hide_banner 1.mp4  > 1.txt
ffprobe -v 32 -print_format default -show_format -show_streams -hide_banner 2.mp4  > 2.txt
fc /l /n 1.txt 2.txt > result-of-checking.txt

В файле result-of-checking.txt оказываются строки и из файла 2.txt, и из файла 1.txt.

Цитата:

***** 1.txt
33: time_base=1/90000
34: start_pts=0
35: start_time=0.000000
36: duration_ts=274777200
37: duration=3053.080000
38: bit_rate=1167100
39: max_bit_rate=N/A
***** 2.TXT
33: time_base=1/90000
34: start_pts=61200
35: start_time=0.680000
36: duration_ts=34682400
37: duration=385.360000
38: bit_rate=1103399
39: max_bit_rate=N/A
Я хочу, чтобы в файле result-of-checking.txt были строки только из файла 2.txt, те строки, которые отличаются от строк файла 1.txt. Как это сделать?

alpap 13-04-2021 13:16 2955652

Вывод в 3.txt одинаковых строк из 1.txt и 2.txt
Код:

@echo off
>"3.txt" findstr /xlg:"2.txt" "1.txt"
pause

Вывод в 3.txt строк из 2.txt, которых нет в 1.txt
Код:

@echo off
>"3.txt" findstr /vxlg:"1.txt" "2.txt"
pause

Общий
Код:

@echo off
>>"3.txt" (
 echo Этого нет в "1.txt"
 findstr /vlg:"1.txt" "2.txt"
 echo:
 echo Этого нет в "2.txt"
 findstr /vlg:"2.txt" "1.txt"
)
pause


DJ Mogarych 13-04-2021 19:21 2955682

Powershell
Код:

$a = & ffprobe -v 32 -print_format default -show_format -show_streams -hide_banner -i "C:\temp\1.mp4"
$b = & ffprobe -v 32 -print_format default -show_format -show_streams -hide_banner -i "C:\temp\2.mp4"

(diff $a $b |? SideIndicator -eq '=>').Inputobject |sort > C:\temp\result-of-checking.txt


alpap 14-04-2021 13:45 2955712

если на PowerShell, тогда по типу моего "Общий" на cmd
Код:

$file1 = 'C:\1.txt'
$file2 = 'C:\2.txt'
$fileZ = 'C:\3.txt'

$z = compare $(gc $file1) $(gc $file2)

"Этого нет в $file1"                              >> $fileZ
$z.where({$_.SideIndicator -eq '=>'}).InputObject >> $fileZ
"Этого нет в $file2"                              >> $fileZ
$z.where({$_.SideIndicator -eq '<='}).InputObject >> $fileZ


Konstantinkn 15-04-2021 15:09 2955778

alpap, DJ Mogarych, спасибо. Принял к сведению.

Цитата:

Цитата alpap
Вывод в 3.txt строк из 2.txt, которых нет в 1.txt »

Код:

@echo off
>"3.txt" findstr /vxlg:"1.txt" "2.txt"
pause

alpap, как сделать, чтобы строки в файлах 1.txt, 2.txt, 3.txt были пронумерованы?

alpap 16-04-2021 05:30 2955812

Цитата:

Цитата Konstantinkn
чтобы строки в файлах 1.txt, 2.txt, 3.txt были пронумерованы? »

только в "3.txt" и непосредственно найденные строки
Код:

@echo off
>>"3.txt" (
 echo Этого нет в "1.txt"
 findstr /nvlg:"1.txt" "2.txt"
 echo:
 echo Этого нет в "2.txt"
 findstr /nvlg:"2.txt" "1.txt"
)
pause

иначе - использовать AkelPad, как я или другой "правильный" текстовый редактор

Konstantinkn 16-04-2021 21:16 2955870

alpap, спасибо. Принял к сведению.


Время: 05:49.

Время: 05:49.
© OSzone.net 2001-