如何在 Windows 批处理文件中为 ffmpeg 输出的重复文件名添加后缀?
How to add suffix to duplicate filenames output by ffmpeg in Windows batch file?
我在 Sony Vegas Pro 中编写了一个脚本,输出以下形式的视频文件 (E:\editlist.txt) 的编辑列表,其中第 2 项是开始时间码,第 3 项是长度:
E:\folder\file1a.mp4 16.8835333 17.5175
E:\folder\file2a.mp4 6.0393666 12.1454666
E:\folder\file3a.mp4 0 3.5368667
E:\folder\file3a.mp4 5.1344667 9.3033
E:\folder\file3a.mp4 12.1224623 19.483756
我还拼凑了一个 Windows 批处理脚本,该脚本使用 ffmpeg trim 这些文件并将它们重新包装在 .mov 容器中。
for /F "tokens=1,2,3 delims= " %%F in (E:\editlist.txt) do ffmpeg.exe -ss "%%G" -i "%%F" -c copy -t "%%H" "%%~dF%%~pF%%~nF.mov"
但是,由于某些文件源自同一源文件(在本例中为 file3a.mp4),trimmed 文件具有重名。
我想创建一个脚本来检测重复项并在输出文件名的文件扩展名之前添加一个递增的个位数后缀。在这种情况下,5 个输出文件应为 file1a.mov、file2a.mov、file3a.mov、file3a1.mov 和 file3a2.mov.
我试过了,但我没有写 Windows 批处理文件的经验,所以下面的努力失败了,可能是非常错误的,但希望它能展示我想要实现的目标(它是松散的基于 an answer to this question):
for /F "tokens=1,2,3 delims= " %%F in (E:\editlist.txt)
set counter=0
if exist "%%~dF%%~pF%%~nF.mov" (
set counter=%counter%+1
do ffmpeg.exe -ss "%%G" -i "%%F" -c copy -t "%%H" "%%~dF%%~pF%%~nF%counter%.mov"
) else do ffmpeg.exe -ss "%%G" -i "%%F" -c copy -t "%%H" "%%~dF%%~pF%%~nF.mov"
如果有人能帮助我完成这项工作,我将不胜感激。谢谢!
假设列表文件已排序且文件名不包含 !
,使用 set /a for calculations and enable the delayed expansion 作为变量:
@echo off
setlocal enableDelayedExpansion
set prevfile=
for /F "tokens=1,2,3 delims= " %%F in (E:\editlist.txt) do (
if "%%F"=="!prevfile!" (
if "!counter!"=="" (set counter=1) else (set /a counter+=1)
) else (
set counter=
set "prevfile=%%F"
)
ffmpeg -ss "%%G" -i "%%F" -c copy -t "%%H" "%%~dpnF!counter!.mov"
)
pause
这只是对您第二次尝试的语法更正。不要把它当作答案。
for /F "tokens=1,2,3 delims= " %%F in (E:\editlist.txt) do (
set counter=0
if exist "%%~dF%%~pF%%~nF.mov" (
set counter=%counter%+1
ffmpeg.exe -ss "%%G" -i "%%F" -c copy -t "%%H" "%%~dF%%~pF%%~nF%counter%.mov"
) else (
ffmpeg.exe -ss "%%G" -i "%%F" -c copy -t "%%H" "%%~dF%%~pF%%~nF.mov"
)
)
这是您的原始方法,修正了一些细节:
@echo off
setlocal EnableDelayedExpansion
for /F "tokens=1,2,3 delims= " %%F in (E:\editlist.txt) do (
if exist "%%~dF%%~pF%%~nF.mov" (
set /A counter=counter+1
) else (
set "counter="
)
ffmpeg.exe -ss "%%G" -i "%%F" -c copy -t "%%H" "%%~dF%%~pF%%~nF!counter!.mov"
)
当变量未定义时,set /A
命令在其位置插入一个零。
我在 Sony Vegas Pro 中编写了一个脚本,输出以下形式的视频文件 (E:\editlist.txt) 的编辑列表,其中第 2 项是开始时间码,第 3 项是长度:
E:\folder\file1a.mp4 16.8835333 17.5175
E:\folder\file2a.mp4 6.0393666 12.1454666
E:\folder\file3a.mp4 0 3.5368667
E:\folder\file3a.mp4 5.1344667 9.3033
E:\folder\file3a.mp4 12.1224623 19.483756
我还拼凑了一个 Windows 批处理脚本,该脚本使用 ffmpeg trim 这些文件并将它们重新包装在 .mov 容器中。
for /F "tokens=1,2,3 delims= " %%F in (E:\editlist.txt) do ffmpeg.exe -ss "%%G" -i "%%F" -c copy -t "%%H" "%%~dF%%~pF%%~nF.mov"
但是,由于某些文件源自同一源文件(在本例中为 file3a.mp4),trimmed 文件具有重名。
我想创建一个脚本来检测重复项并在输出文件名的文件扩展名之前添加一个递增的个位数后缀。在这种情况下,5 个输出文件应为 file1a.mov、file2a.mov、file3a.mov、file3a1.mov 和 file3a2.mov.
我试过了,但我没有写 Windows 批处理文件的经验,所以下面的努力失败了,可能是非常错误的,但希望它能展示我想要实现的目标(它是松散的基于 an answer to this question):
for /F "tokens=1,2,3 delims= " %%F in (E:\editlist.txt)
set counter=0
if exist "%%~dF%%~pF%%~nF.mov" (
set counter=%counter%+1
do ffmpeg.exe -ss "%%G" -i "%%F" -c copy -t "%%H" "%%~dF%%~pF%%~nF%counter%.mov"
) else do ffmpeg.exe -ss "%%G" -i "%%F" -c copy -t "%%H" "%%~dF%%~pF%%~nF.mov"
如果有人能帮助我完成这项工作,我将不胜感激。谢谢!
假设列表文件已排序且文件名不包含 !
,使用 set /a for calculations and enable the delayed expansion 作为变量:
@echo off
setlocal enableDelayedExpansion
set prevfile=
for /F "tokens=1,2,3 delims= " %%F in (E:\editlist.txt) do (
if "%%F"=="!prevfile!" (
if "!counter!"=="" (set counter=1) else (set /a counter+=1)
) else (
set counter=
set "prevfile=%%F"
)
ffmpeg -ss "%%G" -i "%%F" -c copy -t "%%H" "%%~dpnF!counter!.mov"
)
pause
这只是对您第二次尝试的语法更正。不要把它当作答案。
for /F "tokens=1,2,3 delims= " %%F in (E:\editlist.txt) do (
set counter=0
if exist "%%~dF%%~pF%%~nF.mov" (
set counter=%counter%+1
ffmpeg.exe -ss "%%G" -i "%%F" -c copy -t "%%H" "%%~dF%%~pF%%~nF%counter%.mov"
) else (
ffmpeg.exe -ss "%%G" -i "%%F" -c copy -t "%%H" "%%~dF%%~pF%%~nF.mov"
)
)
这是您的原始方法,修正了一些细节:
@echo off
setlocal EnableDelayedExpansion
for /F "tokens=1,2,3 delims= " %%F in (E:\editlist.txt) do (
if exist "%%~dF%%~pF%%~nF.mov" (
set /A counter=counter+1
) else (
set "counter="
)
ffmpeg.exe -ss "%%G" -i "%%F" -c copy -t "%%H" "%%~dF%%~pF%%~nF!counter!.mov"
)
当变量未定义时,set /A
命令在其位置插入一个零。