如何使用 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
子例程 MoveFiles
在 result_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 /?
另请参阅:
- 有关 Using command redirection operators 的 Microsoft 文档,用于解释
>nul
。
- Single line with multiple commands using Windows batch file 解释运算符
&
.
有一个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
子例程 MoveFiles
在 result_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
- Slices_1
命令exit /B
可以替换为goto SliceDone
,在发布的代码下方带有标签:SliceDone
,更多命令行以endlocal
作为最后一个命令行。
为了了解使用的命令及其工作原理,请打开 command prompt window,在其中执行以下命令,并仔细阅读为每个命令显示的所有帮助页面。
call /?
echo /?
endlocal /?
exit /?
for /?
goto /?
if /?
md /?
move /?
set /?
setlocal /?
另请参阅:
- 有关 Using command redirection operators 的 Microsoft 文档,用于解释
>nul
。 - Single line with multiple commands using Windows batch file 解释运算符
&
.