1

У меня есть папка X:\Export которой есть несколько папок:

X:\Export
+---Export1
|   \---various files …
+---Export2
|   \---… and subfolders
+---Export3
|   \---etc.
\---etc.            (names vary widely)

Каждая папка «Экспорт» имеет одинаковую структуру подкаталогов, но они имеют разные файлы (возможно, с некоторыми конфликтами имен). Я хотел бы скопировать все подпапки и файлы X:\Export\Export1 , X:\Export\Export2 , X:\Export\Export3 и т.д. В папку X:\Export\merged , сохраняя структуру подкаталогов ,

Псевдокод того, что я хотел бы сделать, но не могу работать должным образом:

create new folder "merged"
for (every folder X in a given directory Y (i.e., X:\Export)
    copy every file in X keeping directory structure to "merged"
If conflict then overwrite

1 ответ1

1

Как насчет

@echo off
md merged
for /f "delims=" %%f in ('dir /b /ad') do (
    if not %%f==merged xcopy "%%f" merged /s /y
)

Параметр /y приводит к перезаписи файлов без запроса подтверждения.  Замените /s на /e если вы хотите скопировать пустые подкаталоги.


Дополнительное объяснение: for /f "options"(optional) variable in ('command') запускает команду, записывает выходные данные, назначает токены (строки) из этого вывода переменной, а затем запускает команду (команды) после do . dir /b означает показывать только имена файлов (без атрибутов, нет и . dir /ad означает список только каталогов (без файлов).

Поведение по умолчанию для for /f заключается в создании токена из каждой строки вывода путем переноса всех символов до первого пробела.  Опция "delims=" говорит это , чтобы взять всю линию.  Эта паранойя заставляет скрипт работать, даже если у вас есть имена каталогов с пробелами в них.  Я, вероятно, мог бы сказать, что xcopy %%f merged ; но мне нужны двойные кавычки около %%f (xcopy "%%f" merged) для обработки случая, когда %%f содержит пробелы.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .