Фильтровать слово в строке в пакетном скрипте - PullRequest
0 голосов
/ 29 апреля 2020

Я создал пакетный скрипт для windows, который я использую для файлов mux mkv. При запуске этой команды:

ffprobe -v 0 -select_streams s -show_entries stream=index:disposition=default -of compact=nk=0 file.mkv | findstr disposition:default=1

Вывод:

stream|index=3|disposition:default=1

Как можно отфильтровать и распечатать только число «3» и поместить его в переменную?

Ответы [ 2 ]

0 голосов
/ 01 мая 2020

Я отправляю новую команду, которая упрощает вывод:

ffprobe -v 0 -select_streams s -show_entries stream=index:disposition=forced:stream_tags=language -of csv=nk=1:p=0 file.mkv | FINDSTR /C:"1,ita"

Вывод:

3,1, ita

"3" - это идентификатор дорожки, "1 "принудительный флаг", "ита" является языком отслеживания. Чтобы создать переменную, которая содержит только идентификатор дорожки (например, 3) для вставки в команду mkvmerge, я запустил эту команду:

FOR /F "delims=, tokens=1" %%# IN ('ffprobe -v 0 -select_streams s -show_entries stream=index:disposition=forced:stream_tags=language -of csv=nk=1:p=0 file.mkv ^| FINDSTR /C:"1,ita"') DO SET subid=%%#

Но ничего не происходит! Mkvmerge сообщает об этой ошибке: Ошибка: Invalid track ID or language code in '-s '.

Я действительно не знаю, где ошибка!

0 голосов
/ 01 мая 2020

Подход пакетного файла

Вам необходимо выполнить команду внутри оператора for внутри пакетного файла, чтобы иметь возможность захватывать выходные строки и обрабатывать их дальше. Проверьте for /? в командной строке и части с помощью for /f и узнайте о «usebackq».
Ключевым моментом является то, что вам нужно экранировать несколько специальных символов из вашей команды, если она выполняется в операторе for а не в командной строке напрямую.
Попробуйте заставить этот кусок работать и опубликуйте свое решение как обновление своего ответа, если хотите. Тогда мы можем перейти ко второй части извлечения числа.

...