%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
%%v
format,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 folder
vs 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