无法使用 ffprobe 提取持续时间信息,文件名中的逗号弄乱了我的 for 循环

无法使用 ffprobe 提取持续时间信息,文件名中的逗号弄乱了我的 for 循环

%folder%此处的批处理脚本从使用中创建文件列表%wildcards%,然后在驱动器上创建一个镜像目录,c:其中包含每个文件的 txt 版本,例如every file.mkv.txt,其中包含原始文件的数据,例如path-to-file/duration/size

setLocal enableDelayedExpansion
:: adder fails with filenames with ampersand "&". investigate
for /f "delims=" %%v in ('dir "%folder%\%wildcards%" /b /s /a-d 2^>nul') do (
    if not exist "c:%%~pv" mkdir "c:%%~pv"
    if not exist "c:%%~pnxv.txt" for /f "usebackq tokens=2 delims=," %%i in ('"%ffprobe%" -v quiet -show_entries "format=duration" -of csv "%%v"') do (
        rem record path-to-file/duration/size into mirror files
        echo %%v/%%i/%%~zv>"c:%%~pnxv.txt"
    )
)

在某些文件上成功,但在其他文件上失败,我认为这与在文件上执行的,部分中的逗号有关。看起来我需要使用逗号作为分隔符,因为持续时间的格式是这样的。自从我开始需要变量的引号(ffprobe.exe 的路径所在位置)后,它就停止工作了。ffprobe%%vformat,94.436000%ffprobe%

答案1

,我认为这与对文件 %%v 执行 ffprobe 的部分中的逗号 () 有关:

:: adder fails with filenames with ampersand "&". investigate`

只需尝试添加2>&1命令即可ffprob
也可以替换echo string,with &, and commas为:
echo+ & <nul set /p .="Str,ing,s with & and com,mas" >>file

for /f tokens^=* %%v in ('dir "%folder%\%wildcards%" /b /s /a-d 2^>nul')do 2>nul mkdir "c:%%~pv" & if not exist "c:%%~pnxv.txt" (
    for /f usebackq^tokens^=1*delims^=^, %%i in (`2^>^&1 "%ffprobe%" -v quiet -show_entries "format=duration" -of csv "%%v"`)do (
        echo+ & <nul set /p .="%%v/%%j/%%~zv">>"c:%%~pnxv.txt"))

观察:大致相同:2>nul mkdir foldervs if not exist folder (create)do not do(ignore)...

通过使用mkdir folder,您可以在一个操作中创建文件夹(如果文件夹不存在);如果文件夹已存在/未创建,它只会返回一个警告/消息通知其存在,这并不是崩溃/灾难。

这是一个对循环/bat运行没有实际影响的操作,只需要一个命令,并在没有必要的情况下对可能的不执行进行适当的预测处理[ run (if folder exists warning) omit ] and continue......,这是完全可以省略错误/警告的2>nul mkdir Folder_If_Or_Not_Exist & continue

相关内容