将文件从子文件夹移动到根目录,但不能再次运行时将它们复制到下一个目录

时间:2016-11-02 19:34:50

标签: windows batch-file

我有一个文件夹,其中包含带有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文件?

任何帮助将不胜感激!

2 个答案:

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