我正在开展一个类似的项目:
用一个很长的视频硬字幕并将它切成很小的 场景和每个场景持续的时间 副标题消失
剪切每张照片(可能是第一张或最后一张) 原始视频的片段并自动执行
重复(复制并粘贴)提取的图片次数 每个片段上已切割的图片数量 在原始视频
加入所有内容
我已经达到了第1点和第2点,现在我正在努力实现第3点),我需要你的帮助。假设我已经使用这个批处理脚本(我称之为a.bat)实现了第2点:
pushd %1
if not exist newfiles\ (
mkdir newfiles
)
if not exist newfiles2\ (
mkdir newfiles2
)
:start
for %%F in (*.mov) do (
md "%%~nF"
echo "%%~nF"
ffmpeg -i %%F -r 1 -f image2 -qscale:v 2 "%%~nF\%%~nF_image-%%3d.png"
copy "%%~nF\%%~nF_image-001.png" ".\newfiles"
)
popd
所以,我有这种情况:
这意味着在每个文件夹中都有从*.mov
文件中提取的可变数量的图像。现在,我希望位于相关文件夹上的图像列表中的第一个图像被复制到另一个文件夹中,就像在同一个文件夹中的文件一样多。例如,让我们看一下这个文件夹:
这里有4张图片,对吗?我想在此文件夹中复制列表的第一个(或最后一个)图像4次:
我希望有人可以帮我改进这个批处理脚本(我称之为b.bat)......
@echo off
setlocal enabledelayedexpansion
set count=0
for %%x in (*.png) do set /a count+=1
echo %count%
FOR %%F IN (*.png) DO (
set filename=%%F
goto tests
)
:tests
echo "%filename%"
for /l %%i in (1,1,%count%) do copy %filename% ..\newfiles2\%%i.png
endlocal
pause
因为我发现只有当我在每个/每个文件夹中放入它的副本时它才有效,但是我必须在每个文件夹中输入它来运行它,浪费了很多时间。假设我想在所有其他文件夹所在的文件夹中运行它。如何修改脚本呢?如果我在“root”文件夹上运行它会发生这种情况:
编辑:感谢@AlexP的建议我修改了这样的脚本:
@echo off
setlocal enabledelayedexpansion
set count=0
for /d %%d in (render*) do set /a count+=1t
echo %count%
pause
for %%f IN ("%%~d\*") do (
set filename=%%F
goto tests
)
:tests
echo "%filename%"
for /l %%i in (1,1,%count%) do copy %filename% .\%%i.png
endlocal
pause
现在var“count”的值为4,但这是错误的。我需要的值是每个以render *开头的文件夹内;所以,因为我在“render00003211”文件夹中有4个图片,所以值为4; “render00003266”下的5个图片值为5,依旧等等。
更新:我已经通过将此脚本放在重复项文件夹中来按顺序排列图片的名称...
@echo off
setlocal enabledelayedexpansion
mkdir pics
copy *.png .\pics
del *.png
for /d /r %%a in (%1\*.*) do (
set /a counter=0
for %%b in ("%%a\*.*") do (
set /a counter += 1
set zcounter=0000!counter!
set source="%%~fb"
set target="pic!zcounter:~-4!%%~xb"
echo Renaming !source! to !target!
ren !source! !target!
)
)
答案 0 :(得分:0)
for /l %%i in (1,1,%count%) do copy %filename% %somewhere%
来自for /?
:
FOR
/L
%变量IN
(
启动,
步,
结束)
DO
命令[命令参数]该集合是从开始到结束的一系列数字,按步数计算。因此,
(1,1,5)
会生成序列(1 2 3 4 5)
,而(5,-1,1)
会生成序列(5 4 3 2 1)
。
这是一个实现我理解的要求的脚本:
@echo off
:: This script will visit each subdirectory of the directory from where it is
:: run; it will take the first file found in that subdirectory and copy it to
:: the directory ..\Duplicates as many times as there are files in that
:: subdirectory; the names of the copied files are taken from the name of the
:: subdirectory with a numeric suffix appended, and have the extension of the
:: copied file. If ..\Duplicates does not exist then it is created.
setlocal
echo Working in directory "%CD%"
if not exist ..\Duplicates mkdir ..\Duplicates
if not exist ..\Duplicates\. (
echo Destination ..\Duplicates does not exist, and I cannot create it.
exit /b
)
for /d %%d in (*) do call :duplicateDir "%%~d"
exit /b
:duplicateDir
echo * "%~1"
set COUNT=0
set "SUBNAME=%~n1"
set SUBFILE=&
set SUBEXT=&
for %%f in ("%~1\*") do call :duplicateFile "%%~f"
echo "%SUBFILE%" copied %COUNT% times
exit /b
:duplicateFile
if not defined SUBFILE set "SUBFILE=%~1"
if not defined SUBEXT set "SUBEXT=%~x1"
set /a COUNT=COUNT+1
echo copy "%SUBFILE%" "..\Duplicates\%SUBNAME%-%COUNT%%SUBEXT%"
:: copy "%SUBFILE%" "..\Duplicates\%SUBNAME%-%COUNT%%SUBEXT%" >nul
exit /b
请注意,脚本不是实际执行复制,而是显示将要执行的命令。如果您对此感到满意,请注释掉echo copy
并取消注释copy
。