我有一个文件夹,其中包含带有MP4文件的子文件夹。我正在尝试编写一个脚本,在运行时将MP4文件从子文件夹移动到根文件夹中。我编写的批处理文件正在运行,但是当批处理脚本再次运行新的子文件夹时,已经复制到根文件夹的MP4文件会在文件结构中向上移动另一个级别。例如:
C:\MainRoot\Root\Subfolder\media.mp4
运行脚本时,'media.mp4'会根据需要上移到C:\ Root \ media.mp4。 但是因为我需要脚本在计划任务上运行。下次脚本运行时,我得到以下内容:
C:\MainRoot\media.mp4
而不仅仅是停留在C:\ MainRoot \ Root中的MP4文件。 到目前为止,这是我的批处理文件,用于复制mp4文件:
set root_folder=C:\MainRoot\Root
for /f "tokens=1* delims=" %%G in ('dir %root_folder% /b /o:-n /s ^| findstr /i ".mp4" ') do (
move /y "%%G" "%%~dpG..\%%~nxG"
)
我需要修改什么才能移动MP4文件?
任何帮助将不胜感激!
答案 0 :(得分:0)
由于所有源文件似乎都在某个目录级别,因此for /D
循环可以围绕您的for /F
循环,该循环解析非递归dir
的输出命令行(无/S
):
@echo off
setlocal EnableExtensions DisableDelayedExpansion
rem // Define constants here:
set "_ROOT=C:\MainRoot\Root"
set "_PATTERN=*.mp4"
rem // Loop through sub-directories:
for /D %%D in ("%_ROOT%\*") do (
rem // Loop through matching files:
for /F "eol=| delims=" %%F in ('dir /B "%%~fD\%_PATTERN%"') do (
rem // Avoid overwriting destination file:
if not exist "%_ROOT%\%%~nxF" (
rem // Move matching file one level up:
move /Y "%%~fD\%%~nxF" "%_ROOT%\%%~nxF"
)
)
)
endlocal
exit /B
答案 1 :(得分:0)
如果您愿意在提供的示例中进行覆盖,那么这样简单的事情可能适合您的目的:
@Echo Off
Set root_folder=C:\MainRoot\Root
If /I NOT "%CD%"=="%root_folder%" PushD "%root_folder%" 2>Nul||Exit/B
For /R %%G In (*.mp4) Do If /I NOT "%~dpG"=="%root_folder%\" Move "%%G">Nul 2>&1
如果文件只有一个文件夹,您可能更喜欢这个:
@Echo Off
Set root_folder=C:\MainRoot\Root
If /I NOT "%CD%"=="%root_folder%" PushD "%root_folder%" 2>Nul||Exit/B
For /D %%G In (*) Do Move "%%G\*.mp4">Nul 2>&1