找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 4552|回复: 10

[文本处理] 求BAT或VBS把文本内的时间统一偏移

[复制链接]
发表于 2025-6-25 21:56:36 | 显示全部楼层 |阅读模式
本帖最后由 vq86 于 2025-6-25 23:10 编辑

求bat或vbs都行。。

问题说明:时间统一偏移

歌词LRC源文件
[00:02.95]原来你什么都不要-张惠妹
[00:15.56]我知道这样不好
[00:19.50]也知道你的爱只能那么少
[00:24.37]我只有不停的要 要到你想逃
[00:33.79]泪湿的枕头 晒干就好
[00:38.17]眼泪在你的心里只是无理取闹


要统一把时间增加10秒(如下)
[00:12.95]原来你什么都不要-张惠妹
[00:25.56]我知道这样不好
[00:29.50]也知道你的爱只能那么少
[00:34.37]我只有不停的要 要到你想逃
[00:43.79]泪湿的枕头 晒干就好
[00:48.17]眼泪在你的心里只是无理取闹



上传txt附件总是失败,不知道为什么,可以复制下面(原歌词)然后另存为
我测试过,以下所有时间如果统一增加19.5秒是最完美匹配我的音频。
一行行改太麻烦太多还要算,而且以后大概率还会遇到相同要求。
故求bat或vbs都行,如果可以自定义所需要增加或减少的时间就妙了
  1. [00:02.95]原来你什么都不要-张惠妹
  2. [00:15.56]我知道这样不好
  3. [00:19.50]也知道你的爱只能那么少
  4. [00:24.37]我只有不停的要 要到你想逃
  5. [00:33.79]泪湿的枕头 晒干就好
  6. [00:38.17]眼泪在你的心里只是无理取闹
  7. [00:42.77]以为在你身后 是我一辈子的骄傲
  8. [00:52.23]原来你什么都不想要
  9. [01:01.73]我不要你的呵护 你的玫瑰
  10. [01:06.37]只要你好好久久爱我一遍
  11. [01:11.29]就算虚荣也好 贪心也好
  12. [01:16.01]哪个女人对爱不自私 不奢望
  13. [01:20.31]我不要你的承诺 不要你的永远
  14. [01:25.01]只要你真真切切爱我一遍
  15. [01:30.05]就算虚荣也好 贪心也好
  16. [01:34.82]最怕你把沉默 当做对我的回答
  17. [02:25.52]我知道这样不好
  18. [02:29.42]也知道你的爱只能那么少
  19. [02:34.08]我只有不停的要 要到你想逃
  20. [02:43.22]泪湿的枕头 晒干就好
  21. [02:47.43]眼泪在你的心里只是无理取闹
  22. [02:52.22]以为在你身后 是我一辈子的骄傲
  23. [03:01.61]原来你什么都不想要
  24. [03:10.66]我不要你的呵护 你的玫瑰
  25. [03:15.45]只要你好好久久爱我一遍
  26. [03:20.31]就算虚荣也好 贪心也好
  27. [03:24.75]哪个女人对爱不自私 不奢望
  28. [03:29.13]我不要你的承诺 不要你的永远
  29. [03:33.60]只要你真真切切爱我一遍
  30. [03:38.47]就算虚荣也好 贪心也好
  31. [03:42.87]最怕你把沉默当做对我的回答
  32. [03:56.80]我不要你的承诺 不要你的永远
  33. [04:00.95]只要你真真切切爱我一遍
  34. [04:05.85]就算虚荣也好 贪心也好
  35. [04:10.29]哪个女人对爱不自私 不奢望
  36. [04:14.69]我不要你的承诺 不要你的永远
  37. [04:19.41]只要你真真切切爱我一遍
  38. [04:24.18]就算虚荣也好 贪心也好
  39. [04:28.74]最怕你把沉默 当做对我的回答
  40. [04:52.48]原来你 什么都不想要
复制代码
发表于 2025-6-25 22:35:50 | 显示全部楼层
本帖最后由 aloha20200628 于 2025-6-25 22:55 编辑

回复 1# vq86

以下代码存为 test.bat 运行,与源文件 1.lrc(假设源文件编码是 ansi 或简中编码 gb2312)同目录,代码第一行预设秒增量 ds=10 可自定义...

  1. @echo off &setlocal &set "ds=10"
  2. (for /f "tokens=1-3* delims=[:.]" %%a in (1.lrc) do (
  3.    set "v=%%d" &setlocal enabledelayedexpansion
  4.    set/a "s=%ds%+%%b,m=s/60,s%%=60,m+=%%a"
  5.    if !m! leq 9 set "m=0!m!"
  6.    if !s! leq 9 set "s=0!s!"
  7.    echo,[!m!:!s!.%%c]%%d&endlocal ))>"1.new.lrc"
  8. type "1.new.lrc" &pause&exit/b
复制代码
若源文件 1.lrc 是 utf-8 编码,则须将以上代码第一行改为如下行即可...

  1. @echo off &setlocal &set "ds=10" &chcp 65001>nul
复制代码
发表于 2025-6-25 22:35:55 | 显示全部楼层
回复 1# vq86


    请上传一个LRC文件到网盘,便于测试代码。
 楼主| 发表于 2025-6-25 23:12:18 | 显示全部楼层
回复 3# Batcher


    上传不了附件,总是失败,不知道为什么,TXT格式也上传失败
但我已经用代码形式发在1楼了,方便复制另存为,求大佬测试。
 楼主| 发表于 2025-6-25 23:24:15 | 显示全部楼层
回复 2# aloha20200628


    测试成功,谢谢
如果能再细化一点就更好了,比如提供一个ds=的格式可以和00:38.17一样,因为有时候需要加或减的的时间可能存在精选的小数点
发表于 2025-6-26 00:14:20 | 显示全部楼层
回复 5# vq86

批处没有内置浮点运算,请 powershell 帮忙了,就是慢一点,好在 *.lrc 文件行数不多,不弄 powershell 一锅端的版本了...

  1. @echo off &setlocal &set "ds=00:19.50"
  2. for /f "tokens=1-2 delims=:" %%a in ("%ds%") do set "m=%%a" &set "s=%%b"
  3. (for /f "tokens=1-2* delims=[:]" %%a in (1.lrc) do (
  4.    set "v=%%d" &setlocal enabledelayedexpansion
  5.    for /f "delims=" %%v in ('powershell "$t=(60*%m%+%s%)+60*%%a+%%b;[timespan]::fromseconds($t).tostring('mm\:ss\.ff')" ') do echo,[%%v]%%c&endlocal ))>"1.new.lrc"
  6. type "1.new.lrc" &pause&exit/b
复制代码
发表于 2025-6-26 11:32:45 | 显示全部楼层
本帖最后由 aloha20200628 于 2025-6-26 11:45 编辑

回复 5# vq86

仅让 powershell 逐行处理效率较低,还是给一个高效版本吧... 以下代码存为 test.bat 运行,与源文件 1.lrc 同目录,第二行代码中的 '源文件名' ,'输出文件名' 和时轴 '偏移量' 均可自定义...

  1. <# ::
  2. @echo off &set "lrcF=1.lrc" &set "newF=1.new.lrc" &set "ds=00:19.50"
  3. powershell "$lf,$ds='%lrcF%','%ds%'; iex(${%~f0}|out-string)">"%newF%" &type "%newF%" &pause&exit/b
  4. #>
  5. $t=$ds.split(':');$ds=60*$t[0]+$t[1]; gc $lf|%{$t=[regex]::matches($_,'[\d\:\.]+').value.split(':');$s=60*$t[0]+$t[1]+$ds;$t=[timespan]::fromseconds($s).tostring('mm\:ss\.ff');$_ -replace '[\d\:\.]+', $t};exit
复制代码
发表于 2025-6-26 15:01:11 | 显示全部楼层
回复 5# vq86

再给一个 bat+jscript 版本(存为 test.bat 运行,与源文件 1.lrc 同目录),启速要比 bat+powershell 版本快,但后者却可用时间格式化函数明显简化代码量...

  1. 2>1/* ::
  2. @echo off &setlocal &set "lrcF=1.lrc" &set "newF=1.new.lrc" &set "ds=00:19.50"
  3. type "%lrcF%"|cscript /nologo /e:jscript "%~f0" "%ds%">"%newF%"
  4. type "%newF%" &pause&exit/b */
  5. v=WSH.arguments; ws=WSH.stdin, t=v(0).split(':'), ds=+t[1]+60*t[0];
  6. while (!ws.atendofstream) {
  7.    l=ws.readline(), t=l.match(/[\d\:\.]+/).toString().split(':');
  8.    s=+t[1]+ds+60*t[0], m=Math.floor(s/60), _s=s%60;
  9.    if (_s%1==0) _s+='.00'; else if (_s<10) _s='0'+_s; else _s=_s.toString();
  10.    if (_s.length<5) _s=_s+'0'; else _s=_s.substr(0,5);
  11.    m=m>9?m:'0'+m, t=m+':'+_s, WSH.echo(l.replace(/[\d\:\.]+/, t)); }
  12. WSH.quit()
复制代码
发表于 2025-6-27 16:50:10 | 显示全部楼层
  1. Dim srcFile, dstFile,sSecond
  2. srcFile = "1.txt"    '源文件
  3. dstFile = "2.txt"    '目标文件
  4. sSecond = 19.5       '增加秒数为正,减少秒数为负

  5. Dim fso, objFile
  6. Set fso = CreateObject("Scripting.FileSystemObject")
  7. Set objFile = fso.OpenTextFile(srcFile, 1)

  8. Dim reg
  9. Set reg = New RegExp
  10. reg.Pattern = "^\[([0-5][0-9]):([0-5][0-9]\.[0-9][0-9])\](.*)$"

  11. Dim n
  12. n = 0
  13. ReDim arr(n)

  14. Do Until objFile.AtEndOfStream
  15.     Dim str, match
  16.     ReDim PreServe arr(n)
  17.     str = objFile.ReadLine
  18.     Set match = reg.Execute(str)
  19.     If match.Count > 0 Then
  20.         Dim t, mm, ss, cs
  21.         t  = 6000 * match(0).SubMatches(0) + 100 * (sSecond + match(0).SubMatches(1))
  22.         mm = Mid(Fix(t / 6000) + 100, 2)
  23.         ss = Mid(t Mod 6000 + 10000, 2, 2)
  24.         cs = Mid(t Mod 6000 + 10000, 4)
  25.         str = "[" & mm & ":" & ss & "." & cs & "]" & match(0).SubMatches(2)
  26.     End If
  27.     arr(n) = str
  28.     n = n + 1
  29. Loop

  30. fso.OpenTextFile(dstFile, 2, True).Write Join(arr, vbCrLf)

  31. MsgBox "Done"
复制代码
发表于 2025-6-27 16:51:34 | 显示全部楼层
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set cs=1950
  4. for /f "tokens=1-3* delims=[:.]" %%a in (1.txt) do (
  5.     set /a "t=6000*(1%%a-100)+(1%%b%%c-10000)+%cs%, m=t/6000+100, s=t%%6000+10000"
  6.     echo [!m:~-2!:!s:~1,2!.!s:~-2!]%%d
  7. )
  8. pause
复制代码

评分

参与人数 1技术 +1 收起 理由
77七 + 1 感谢分享

查看全部评分

发表于 2025-6-27 16:59:36 | 显示全部楼层
  1. $str = gc 1.txt -Raw -ReadCount 0;
  2. $str = [regex]::Replace($str,'(?<=\[)[0-5][0-9]:[0-5][0-9]\.[0-9][0-9](?=\])',{[DateTime]::ParseExact($args.Groups[0].Value,'mm:ss.ff',$null).AddSeconds('19.5').ToString('mm:ss.ff')});
  3. sc 2.txt -Value $str;
  4. pause
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 07:06 , Processed in 0.022654 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表