У меня такая иерархия файлов:
RootDir
/A
/fileA.txt
/B
/C
/fileC.txt
/fileB.txt
/otherFile1.txt
/otherFile2.txt
Я хотел бы скопировать только подкаталоги (например A
, B
) ивсе, что под ними(то есть я хочу, чтобы было скопировано все, КРОМЕ otherFile1.txt
и otherFile2.txt
).
В корневом каталоге находится гораздо больше двух каталогов и двух файлов, поэтому я бы не стал указывать каждый из них по имени.
Какие-либо предложения?
решение1
Вы можете использовать комбинациюдля /ф,xcopyиреждля выполнения этой задачи:
cd SOURCE
for /F "delims=" %a in ('dir /B /AD') do @xcopy /E "%a" "DESTINATION\%a\"
Как это работает:
Как только вы войдете вИСТОЧНИКкаталог, команда
dir /B /AD
выводит список всех каталогов (/AD
), построчно (/B
).for /F "delims=" %a in ('...') do
просматривает вывод команды...
, устанавливает переменную%a
на следующую строку вывода и выполняет все, что следует за нейdo
.Здесь
delims=
гарантирует, что переменная содержит все содержимое строки. Без нее%a
будут храниться только символы до первого пробела.xcopy /E "%a" "DESTINATION\%a\"
копирует текущий указанный каталог в%a
папку с тем же именем в каталогеМЕСТО НАЗНАЧЕНИЯ./E
Переключатель также копирует содержимое каталога. 1Указание имени каталога в месте назначения является обязательным. Без него
fileA.txt
будет скопировано вDESTINATION\fileA.txt
(а неDESTINATION\A\fileA.txt
).Завершающий обратный слеш используется для указания того, что
%a
это имя каталога, а не файла. Двойные кавычки необходимы для правильной обработки имен каталогов, содержащих пробелы.
Если эта команда будет использоваться внутри пакетного файла, все знаки процента должны быть экранированы вторым знаком процента, т. е. %a
станет %%a
.
1 /E
копирует также пустые каталоги. Если это нежелательно, можно использовать /S
вместо этого.
решение2
Аналогично ответам Денниса и Дэвида Руманнов, но с использованием цикла FOR /D вместо FOR /F.
for /d %F in (rootFolderPath\*) do @xcopy /e /i "%F" "destinationPath\%~nxF"
решение3
Лучший способ, который я могу придумать, — это использовать переключатель Robocopy «/create», который копирует только всю структуру папок, и «только файлы нулевой длины» — что, я уверен, приведет к исключению всех ваших файлов.
Robocopy /e /create \(исходный путь к папке A) \(конечный путь)
Robocopy /e /create \(исходный путь к папке B) \(конечный путь)
Вы также можете (если все типы файлов одинаковые или известно небольшое количество типов файлов) использовать переключатель «Исключить файл» «/xf» и исключить типы файлов с помощью подстановочных знаков, например:
Robocopy /e (исходный путь папки A) (конечный путь) /xf *.txt
Robocopy /e (исходный путь папки B) (конечный путь) /xf *.txt
решение4
Собственное решение Windows CMD. Копировать только подпапки (и их содержимое) из RootDir.
for /f "delims=" %%A in ('dir RootDir /a:d /b') do xcopy %%A DestDir /e /i