Копировать файлы рекурсивно из внутреннего каталога наружу, используя пакетный файл

Вот такая структура каталогов:

Dir1
--Dir2
    --File1
    --File2
--Dir3
    --File3
--File4
--File5

Теперь я хочу скопировать все файлы в подкаталоге (Dir2, Dir3) в родительский каталог Dir1, используя пакетные файлы. Я придумал приведенный ниже код, но он не работает идеально. Я получаю следующий вывод -

Directory2             --It has 4 files all together
Invalid number of parameters
Invalid number of parameters
Does E:\Directory1\Copy\File1.dat specify a file name   -- And only this file gets copied
or directory name on the target
(F = file, D = directory)?

Код -

@echo off
call :treeProcess
Pause
goto :eof

:treeProcess
rem Do whatever you want here over the files of this subdir, for example:
for /D %%d in (*) do (
    echo %%d
    cd %%d
    for %%f in (*) do xcopy %%f E:\Movies\Copy\%%f
    call :treeProcess
    cd ..
)
exit /b

person Priyam    schedule 11.02.2013    source источник
comment
Я в основном использую для этого однострочную команду... Dir1>XCOPY * . * /s Каталог1   -  person Kingk    schedule 11.02.2013
comment
Я думаю, вы использовали этот stackoverflow.com/a/8398621 в качестве отправной точки.   -  person Bruno Bieri    schedule 15.01.2021


Ответы (1)


Нет необходимости в пакетном файле. Выполните следующую команду из папки Dir1:

for /r /d %F in (*) do @copy /y "%F\*"

Как пакетный файл

@echo off
for /r /d %%F in (*) do copy /y "%%F\*"

НО. Имейте в виду, что у вас может быть одно и то же имя файла в нескольких дочерних папках. Только один выживет в вашем Dir1.

ИЗМЕНИТЬ

Вышеприведенное предполагает, что вы запускаете команду (или скрипт) из папки Dir1. Его можно запустить из любого места, если сценарий дополнен путем включения пути к каталогу Dir1.

for /r "pathToDir1" /d %F in (*) do @copy /y "pathToDir1\%F\*"

или как пакетный файл

@echo off
set "root=pathToDir1"
for /r "%root%" /d %%F in (*) do copy /y "%root%\%%F\*"

Вы можете передать путь к Dir1 в качестве аргумента пакетному файлу. Передайте . в качестве пути, если хотите использовать текущую папку.

@echo off
for /r %1 /d %%F in (*) do copy /y "%~1\%%F\*"
person dbenham    schedule 11.02.2013
comment
Если ни в одной из дочерних папок нет дубликатов, будет ли эта команда копировать все файлы из каждой дочерней папки в другую папку? Кроме того, пункт назначения сам по себе является дочерней папкой, поэтому, наверное, мне следует переместить ее в новое место? - person Priyam; 12.02.2013
comment
@Priyam - Да, он копирует файлы в текущий каталог (я предполагаю, что это Dir1). У вас все в порядке, пока ваши исходные папки являются дочерними папками Dir1. Смотрите мой обновленный ответ. - person dbenham; 12.02.2013