Json Windows批处理-提取ffmpeg处理的值

Json Windows批处理-提取ffmpeg处理的值,json,windows,batch-file,cmd,file-search,xidel,Json,Windows,Batch File,Cmd,File Search,Xidel,我有几十个json文件,我试图在每个文件中找到两个值,并将结果分配给两个单独的变量,以进行ffmpeg处理 示例json文件如下所示: { "year": "2018", "track": "12", ... other data omitted } 我希望提取2018和12,以便在以下ffmpeg命令中使用它们: ffmpeg -i "same_file_name_as_json.m4a

我有几十个json文件,我试图在每个文件中找到两个值,并将结果分配给两个单独的变量,以进行ffmpeg处理

示例json文件如下所示:

{
    "year": "2018",
    "track": "12",
... other data omitted
}
我希望提取2018和12,以便在以下ffmpeg命令中使用它们:

ffmpeg -i "same_file_name_as_json.m4a" -metadata:s:a:0 year=2018 --metadata:s:a:0 track=12 -acodec libmp3lame "same_file_name_as_json.mp3"
是否可以编写一个批处理文件以获得所需的结果?任何帮助都将不胜感激,因为我是findstr和设置变量的完全新手。多谢各位

编辑:

set "year=" & set "track="
for %%i in (*.json) do (
  for /f "usebackq tokens=1,2 delims={:}, " %%a in ("%%i") do (
    set "%%~a=%%~b"
    if defined year if defined track goto :CONT
    )
:CONT
C:\ffmpeg -i "%%~ni.m4a" -metadata:s:a:0 year=%year% -metadata:s:a:0 track=%track% -acodec libmp3lame "%%~ni.mp3"
)
pause

Windows批处理脚本不理解JSON文件格式,因此最好使用本机支持它的语言。将JSON视为“普通”文本并不是最好的主意,因为只有不违反JSON格式的微小更改(例如,添加、删除或移动换行符)仍然会带来很大的麻烦

也就是说,考虑到JSON文件的显示方式与您所显示的完全相同,并且它具有Unix或DOS/Windows样式的换行符(即,回车符后跟换行符),此代码可能适用于您:

对于/F“usebackq tokens=1,2 delims={:},”%%M in(“file.json”)设置“%%~M=%%~N”
回音年份=%year%
回波轨迹=%track%
如果您有一个巨大的JSON文件,您不想不必要地完全处理,您可以使用以下代码:

set“year=”&set“track=”
对于/F“usebackq tokens=1,2 delims={:},”%%M in(“file.json”)do(
设置“%%~M=%%~N”
如果定义年份如果定义跟踪转到:续
)
:续
回音年份=%year%
回波轨迹=%track%
如果要提取的(非数组)值可能还包含一个已定义的分隔符(
{
}
,空格),则可以将代码扩展到此值,因为这些值不包含字符
*

set“year=”&set“track=”
对于/F“usebackq tokens=1,*delims={:},”%%M in(“file.json”)do(
对于%%K in(%%N),请设置“%%~M=%%~K”
如果定义年份如果定义跟踪转到:续
)
:续
回音年份=%year%
回波轨迹=%track%
为了防止脚本分配不需要的多余变量,您可以尝试以下操作:

对于/F“usebackq tokens=1,2 delims={:},”%%M in(“file.json”)do(
如果“%%~M”==“年”(设置“%%~M=%%~N”),如果“%%~M”==“跟踪”设置“%%~M=%%~N”
)
回音年份=%year%
回波轨迹=%track%
或者,它通过
findstr
命令预处理数据并过滤掉所需的行:

for/F“tokens=1,2 delims={:},”%%M in('
findstr/R/C:“^*\'年\*:”/C:“^*\'轨道\*:”“文件.json”
“)是否设置“%%~M=%%~N”
回音年份=%year%
回波轨迹=%track%

根据您的建议,我建议使用上述最后一种方法,因为没有
goto:CONT
,它不能在循环中使用,因为它会破坏块上下文,并且不会分配其他不需要的变量。由于变量是在循环体中写入和读取的,因此必须启用和应用变量。我将通过以下方式完成所有这些工作:

@echo关闭
setlocal EnableExtensions DisableDelayedExpansion
rem/*迭代当前工作目录(`%CD%`)中的'*.json`文件;
rem若要使用此脚本的父目录,请改用“%~dp0*.json”:*/
对于“*.json”中的%%I,请执行以下操作(
rem//将当前JSON文件的名称存储在变量中:
设置“名称=%%~nI”
rem//清除变量以便以后检查可用性:
设置“年=”&设置“轨迹=”
rem//处理当前JSON文件:
对于/F“tokens=1,2 delims={:},”%%M in('
findstr/R/C:“^*\”年*:“/C:“^*\”轨道*:”“%%~I”
""做"(
rem//分配年份和跟踪变量:
设置“%%~M=%%~N”
rem//年度和跟踪检查均可用:
如果定义了年份如果定义了轨迹(
rem//切换延迟扩展以避免出现“!”问题:
setlocal EnableDelayedExpansion
rem//最终使用所有派生数据执行`ffmpeg`工具:
ffmpeg-i“!name!.m4a”-元数据:s:a:0 year=!year!-元数据:s:a:0 track=!track!-acodec libmp3lame“!name!.mp3”
端部
)
)
)
端部
退出/B

Windows批处理脚本不理解JSON文件格式,因此最好使用本机支持它的语言。将JSON视为“普通”文本并不是最好的主意,因为只有不违反JSON格式的微小更改(例如,添加、删除或移动换行符)仍然会带来很大的麻烦

也就是说,考虑到JSON文件的显示方式与您所显示的完全相同,并且它具有Unix或DOS/Windows样式的换行符(即,回车符后跟换行符),此代码可能适用于您:

对于/F“usebackq tokens=1,2 delims={:},”%%M in(“file.json”)设置“%%~M=%%~N”
回音年份=%year%
回波轨迹=%track%
如果您有一个巨大的JSON文件,您不想不必要地完全处理,您可以使用以下代码:

set“year=”&set“track=”
对于/F“usebackq tokens=1,2 delims={:},”%%M in(“file.json”)do(
设置“%%~M=%%~N”
如果定义年份如果定义跟踪转到:续
)
:续
回音年份=%year%
回波轨迹=%track%
如果要提取的(非数组)值可能还包含一个已定义的分隔符(
{
}
,空格),则可以将代码扩展到此值,因为这些值不包含字符
*

set“year=”&set“track=”
对于/F“usebackq tokens=1,*delims={:},”%%M in(“file.json”)do(
对于%%K in(%%N),请设置“%%~M=%%~K”
如果定义年份如果定义跟踪转到:续
)
:续
回音年份=%year%
回波轨迹=%track%
为了防止脚本分配不需要的多余变量,您可以尝试
xidel -s input.json -e "$json/(year,track)"
#or
xidel -s input.json -e "$json/year,$json/track"
2018
12
FOR /F "delims=" %A IN ('xidel -s input.json -e "$json/(year:=year,track:=track)" --output-format^=cmd') DO %A
#or
FOR /F "delims=" %A IN ('xidel -s input.json -e "year:=$json/year,track:=$json/track" --output-format^=cmd') DO %A
FOR %A IN (*.json) DO @xidel -s %A -e "$json/concat('ffmpeg -i \"%~nA.m4a\" -metadata:s:a:0 year=',year,' --metadata:s:a:0 track=',track,' -acodec libmp3lame \"%~nA.mp3\"')"
ffmpeg -i "name-of-json-file.m4a" -metadata:s:a:0 year=2018 --metadata:s:a:0 track=12 -acodec libmp3lame "name-of-json-file.mp3"
xidel -se "for $x in file:list(.,false(),'*.json') return json-doc($x)/concat('ffmpeg -i \"',replace($x,'json','m4a'),'\" -metadata:s:a:0 year=',year,' --metadata:s:a:0 track=',track,' -acodec libmp3lame \"',replace($x,'json','mp3'),'\"')"
xidel -se ^"^
  for $x in file:list(.,false(),'*.json') return^
  json-doc($x)/concat(^
    'ffmpeg -i \^"',^
    replace($x,'json','m4a'),^
    '\^" -metadata:s:a:0 year=',^
    year,^
    ' --metadata:s:a:0 track=',^
    track,^
    ' -acodec libmp3lame \^"',^
    replace($x,'json','mp3'),^
    '\^"'^
  )^
"