如何使用CMD在文件夹中创建子文件夹并移动其中创建的每10个文件?

问题描述 投票:0回答:1

有一个cmd代码(见下面的代码)。你不能在 Powershell 中执行此操作,因为我需要在 cmd 中执行此操作。此代码使用 ffmpeg 软件将视频切成碎片。关键是,在 ffmpeg 工作之前,我创建命令 MD 文件夹 result_%%i 并将每个处理的文件放在那里 ffmpeg 处理的所有结果(视频文件): result_%%i/%%i%03d.mp4

问题:如何在文件夹中为10个输出切片分别创建一个子文件夹并将它们放在那里?分别如此,result_%%i文件夹下就会有几个子文件夹。

例如,子文件夹应编号为

result_1_%%i 。因此,任何文件的完整路径将如下所示:result_%%i/result_1_%%i/%%i%03d.mp4

@echo off for %%i in (*.mov) do ( MD result_%%i ffmpeg -i "%%i" -filter_complex "[0:v]boxblur=40,scale=1080x1920,setsar=1[bg];[0:v]scale=1080:1920:force_original_aspect_ratio=decrease[fg];[bg][fg]overlay=y=(H-h)/2" -c:v libx264 -profile:v main -level:v 3.0 -x264-params scenecut=0:open_gop=0:min-keyint=72:keyint=72 -c:a aac -preset slow -crf 23 -r 30 -sn -force_key_frames "expr: gte(t, n_forced * 0.5)" -f segment -segment_time 14.5 -reset_timestamps 1 result_%%i/%%i%%03d.mp4 ) pause
    
batch-file cmd ffmpeg
1个回答
2
投票
这是此任务的批处理文件。

@echo off setlocal EnableExtensions DisableDelayedExpansion (for %%i in (*.mov) do ( md "result_%%~ni" ffmpeg.exe -i "%%i" -filter_complex "[0:v]boxblur=40,scale=1080x1920,setsar=1[bg];[0:v]scale=1080:1920:force_original_aspect_ratio=decrease[fg];[bg][fg]overlay=y=(H-h)/2" -c:v libx264 -profile:v main -level:v 3.0 -x264-params scenecut=0:open_gop=0:min-keyint=72:keyint=72 -c:a aac -preset slow -crf 23 -r 30 -sn -force_key_frames "expr: gte(t, n_forced * 0.5)" -f segment -segment_time 14.5 -reset_timestamps 1 "result_%%~ni\%%~ni%%03d.mp4" if not errorlevel 1 set "FolderName=result_%%~ni" & call :MoveFiles )) & exit /B :MoveFiles set "FolderCount=0" :FolderLoop set /A FolderCount+=1 set "SlicesFolder=%FolderName%\Slices_%FolderCount%" md "%SlicesFolder%" set "FileCount=0" for %%j in ("%FolderName%\*.mp4") do ( setlocal EnableDelayedExpansion if !FileCount! == 10 endlocal & goto FolderLoop endlocal move "%%j" "%SlicesFolder%\" >nul set /A FileCount+=1 ) goto :EOF
让我们假设启动批处理文件时的当前目录包含电影文件

Development & Test(!) 100%.mov

批处理文件会在当前目录中创建子目录

result_Development & Test(!) 100%

然后批处理文件运行

ffmpeg.exe

,它会在此目录中创建文件:

Development & Test(!) 100%_001.mp4 Development & Test(!) 100%_002.mp4 Development & Test(!) 100%_003.mp4 Development & Test(!) 100%_004.mp4 Development & Test(!) 100%_005.mp4 Development & Test(!) 100%_006.mp4 Development & Test(!) 100%_007.mp4 Development & Test(!) 100%_008.mp4 Development & Test(!) 100%_009.mp4 Development & Test(!) 100%_010.mp4 Development & Test(!) 100%_011.mp4 Development & Test(!) 100%_012.mp4
子例程 

MoveFiles

result_Development & Test(!) 100%
 中创建另外两个子目录并将文件移入其中。所以最终的目录结构是:

  • 结果_开发和测试(!)100%
    • 切片_1
        开发与测试(!)100%_001.mp4
      • 开发与测试(!)100%_002.mp4
      • 开发与测试(!)100%_003.mp4
      • 开发与测试(!)100%_004.mp4
      • 开发与测试(!)100%_005.mp4
      • 开发与测试(!)100%_006.mp4
      • 开发与测试(!)100%_007.mp4
      • 开发与测试(!)100%_008.mp4
      • 开发与测试(!)100%_009.mp4
      • 开发与测试(!)100%_010.mp4
    • 切片_2
        开发与测试(!)100%_011.mp4
      • 开发与测试(!)100%_012.mp4
命令

exit /B

 可以替换为 
goto SliceDone
,在发布的代码下方带有标签 
:SliceDone
,以及更多命令行,其中 
endlocal
 作为最后一个命令行。

要了解所使用的命令及其工作原理,请打开

命令提示符窗口,执行以下命令,并完整、仔细地阅读每个命令显示的帮助页面。

  • call /?
    
    
  • echo /?
    
    
  • endlocal /?
    
    
  • exit /?
    
    
  • for /?
    
    
  • goto /?
    
    
  • if /?
    
    
  • md /?
    
    
  • move /?
    
    
  • set /?
    
    
  • setlocal /?
    
    
另请参阅:

© www.soinside.com 2019 - 2024. All rights reserved.