批处理脚本 - 从文本文件中提取值

时间:2013-12-17 02:59:49

标签: windows batch-file video text time

我有一个包含数千个子文件夹的文件夹,每个子文件夹包含一个视频文件和一个字幕文件,如下所示:

screenshot of Windows explorer view

每个文本文件(.srt)都是字幕文件,用于在每个视频的开头和结尾显示文件名(不带扩展名)。例如,Track Two - Track Two.srt的内容是:

1
00:00:00,500 --> 00:00:03,500
Track Two - Track Two

2
00:00:00,000 --> 00:00:00,000
Track Two - Track Two

感谢一些严肃的StackHeads,我已经能够通过在./media/父目录中运行以下批处理脚本来自动创建文本文件:

for /R %%f in (*.flv *.mp4) do (
echo(1
echo(00:00:00,500 --^> 00:00:03,500
echo(%%~nf
echo(
echo(2
echo(00:00:00,000 --^> 00:00:00,000
echo(%%~nf
) > "%%~dpnf.srt"

现在我要做的就是更新每个.srt文件的第六行,使其在视频结束前显示三秒钟的文件名。理想情况下,第一个数值在视频结束前3.5秒,第二个值在结束前0.5秒......并且为了使其更难,它必须在俄罗斯时间码.srt文件使用。

例如,如果Track Two - Track Two长度为01:36,则Track Two的第6行 - Track Two.srt应为:

00:01:32,500 --> 00:01:35,500

我可以生成所有视频长度的文本列表,如下所示:

image

..只要我保持文件夹名称严格编号,它们就会每次排队。

有没有办法从文本文件times.txt中提取视频长度(假设顺序是完美的),并以俄语时间码格式更新每个.srt文件的第6行,使其显示之前的标题它引用的视频文件结束了吗?

任何帮助都是慷慨的赞赏!! 另外..再次感谢dbenham,MC ND,payeli之前的帮助!!你是最棒的!

1 个答案:

答案 0 :(得分:1)

@ECHO OFF
SETLOCAL
SETLOCAL ENABLEDELAYEDEXPANSION
FOR /f "skip=1tokens=2,3,11delims=," %%a IN (list.csv) DO (
 SET ttrack=%%a
 SET videoname=%%~nb
 set to_file="%%c\%%~nb.srt"
 CALL :process
)
GOTO :EOF
:process
FOR /f "tokens=1-3delims=:" %%r IN ("%ttrack%") DO (
 SET /a hr=10%%r
 SET /a mi=1%%s
 SET /a se=1%%t
)
CALL :subs 1
SET endtime=%hr:~-2%:%mi:~-2%:%se:~-2%,500
CALL :subs 3
SET starttime=%hr:~-2%:%mi:~-2%:%se:~-2%,500

echo(1
echo(00:00:00,500 --^> 00:00:03,500
echo(!videoname!
echo(
echo(2
echo(%starttime% --^> %endtime%
echo(!videoname!
ECHO(sent to %to_file%
GOTO :eof
::
:: subtract %1 seconds from hr,mi,se
::
:subs
SET /a se-=%1
IF %se% geq 100 GOTO :EOF
SET /a se+=60
SET /a mi-=1
IF %mi% geq 100 GOTO :EOF
SET /a mi+=60
SET /a hr-=1
GOTO :eof

不难。

如果这似乎合适,你需要做的就是改变

echo(1
...
echo(%videoname%
ECHO(sent to %to_file%

(
echo(1
...
echo(%videoname%
)>%to_file%