用于复制和粘贴文件的批处理文件,其数量与文件夹列表中的文件数量相同

时间:2018-06-13 23:27:25

标签: batch-file

我正在开展一个类似的项目:

  1. 用一个很长的视频硬字幕并将它切成很小的 场景和每个场景持续的时间 副标题消失

  2. 剪切每张照片(可能是第一张或最后一张) 原始视频的片段并自动执行

  3. 重复(复制并粘贴)提取的图片次数 每个片段上已切割的图片数量 在原始视频

  4. 加入所有内容

  5. 我已经达到了第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
    

    所以,我有这种情况:

    pic1

    pic2

    pic3

    这意味着在每个文件夹中都有从*.mov文件中提取的可变数量的图像。现在,我希望位于相关文件夹上的图像列表中的第一个图像被复制到另一个文件夹中,就像在同一个文件夹中的文件一样多。例如,让我们看一下这个文件夹:

    pic4

    这里有4张图片,对吗?我想在此文件夹中复制列表的第一个(或最后一个)图像4次:

    pic5

    我希望有人可以帮我改进这个批处理脚本(我称之为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”文件夹上运行它会发生这种情况:

    pic6

    编辑:感谢@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!
        )
    ) 
    

1 个答案:

答案 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