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

How can I use CMD to create a subfolder in a folder and move every 10 files created there?

有一个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

这是该任务的批处理文件。

@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

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

  • result_Development & 测试 (!) 100%
    • Slices_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
    • Slices_2
      • 开发与测试(!) 100%_011.mp4
      • 开发与测试(!) 100%_012.mp4

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

为了了解使用的命令及其工作原理,请打开 command prompt window,在其中执行以下命令,并仔细阅读为每个命令显示的所有帮助页面。

  • call /?
  • echo /?
  • endlocal /?
  • exit /?
  • for /?
  • goto /?
  • if /?
  • md /?
  • move /?
  • set /?
  • setlocal /?

另请参阅: