Получение переменной из вывода jq.exe в Windows пакетного чтения JSON - PullRequest
0 голосов
/ 27 сентября 2019

Мне удалось создать файл JSON , созданный ffprobe , который содержит основную информацию о видеопотоке в контейнере MKV.По jq-win64.exe "[.format.duration]" %%~ni.mkv.json длительность фильма правильно читается из файла и jq echos ["1:36:55.184000"].Теперь я хочу сохранить это значение в глобальной переменной моего скрипта для дальнейшей обработки.Я пробовал несколько подходов, но каждый из них приводил к ошибкам и / или оставлял %duration% пустым.Я попытался, например,

   for %%i in (*.mkv) do (
      SETLOCAL ENABLEDELAYEDEXPANSION
      for /F "tokens=* USEBACKQ" %%F IN ('_tools\jq\jq-win64.exe "[.format.duration]" %%~ni.mkv.json') DO (SET duration=%%F)
      echo Duration is: %duration%
      ENDLOCAL
   ) 

, но не смог повторить %duration%.Я думаю, что это не может быть так сложно, скорее всего, я не делаю синтаксис прямо в пакете Windows.Есть идеи?Вот и файл JSON:

{
    "format": {
        "filename": "TestFile_1080p_26Mbs_8bit_BT709.mkv",
        "nb_streams": 1,
        "nb_programs": 0,
        "format_name": "matroska,webm",
        "format_long_name": "Matroska / WebM",
        "start_time": "0:00:00.000000",
        "duration": "1:36:55.184000",
        "size": "17.586597 Gibyte",
        "bit_rate": "25.978148 Mbit/s",
        "probe_score": 100,
        "tags": {
            "title": "TestFile",
            "encoder": "libmakemkv v1.14.4 (1.3.5/1.4.7) win(x64-release)",
            "creation_time": "2019-08-17T21:01:18.000000Z"
        }
    }
}

Ответы [ 2 ]

1 голос
/ 27 сентября 2019

Вот решение , основанное на моем понимании после комментариев:

    For /F Tokens^=2Delims^=^" %%F In (
        '_tools\jq\jq-win64.exe "[.format.duration]" "%%~ni.mkv.json" 2^>NUL')Do (
        Set "duration=%%F"
        SetLocal EnableDelayedExpansion
        Echo( !duration!
        EndLocal
    )
0 голосов
/ 30 сентября 2019

Если вам нужна только длительность, тогда вам не нужны промежуточные JSON, потому что FFprobe также может сказать вам, что:

ffprobe.exe -v 0 -i <input> -show_entries format=duration -of compact=p=0:nk=1
1:36:55.184000

Создайте переменную:

FOR /F "delims=" %%A IN (
  'ffprobe.exe -v 0 -i <input> -show_entries format=duration -of compact=p=0:nk=1'
) DO SET duration=%%A
SET duration=1:36:55.184000

ЕслиВы все еще хотите проанализировать JSON в FFprobe, тогда нет необходимости создавать json-файлы, так как вместо этого вы можете просто передать его в JQ:

ffprobe.exe -v 0 -i <input> -show_format -of json | jq.exe -r .format.duration
1:36:55.184000

Создать переменную:

FOR /F "delims=" %%A IN (
  'ffprobe.exe -v 0 -i <input> -show_format -of json ^| jq.exe -r .format.duration'
) DO SET duration=%%A
SET duration=1:36:55.184000
...