Как скопировать структуру файлов и папок с помощью xcopy из текстового файла?

У меня есть текстовый файл, содержащий список файлов и папок. Я хочу использовать xcopy для репликации того, что написано в текстовом файле. Мой текстовый файл выглядит так:

"C:\FOLDER"  
"C:\FOLDER\FILE1.TXT"
"C:\FOLDER\FILE2.TXT"
"C:\FOLDER\FOLDER2"
"C:\FOLDER\FOLDER2\FILE3.TXT"

Для заданного каталога вывода "C:\OUTPUT" я хотел бы воспроизвести всю структуру, поэтому:

"C:\OUTPUT\FOLDER"  
"C:\OUTPUT\FOLDER\FILE1.TXT"
"C:\OUTPUT\FOLDER\FILE2.TXT"
"C:\OUTPUT\FOLDER\FOLDER2"
"C:\OUTPUT\FOLDER\FOLDER2\FILE3.TXT"

Как я могу этого добиться? До сих пор я написал цикл for, который читает каждую строку файла, но копирует все файлы, если строка является папкой. Я хочу только скопировать и создать файлы и папки, упомянутые в текстовом файле.

@echo off
for /f "delims=] tokens=1*" %%a in (textfile.txt) do (
   XCOPY /S /E %%a "C:\OUTPUT"
)

Я на правильном пути?

Спасибо и наилучшими пожеланиями,

Андрей


person Andrew    schedule 22.01.2013    source источник


Ответы (1)


Да, вы близки. Просто нужно использовать существующий путь в качестве добавленного пути назначения.

Обновлять

@echo off
for /f "delims=" %%A in (textfile.txt) do if exist "%%~fA\*" (
    md "C:\Output\%%~pA"
    copy /y "%%~fA" "C:\Output\%%~pnxA"
)

Оригинал

Если %%A = "C: \ Folder \ Folder2 \ File3.txt", то %%~pA = Folder \ Folder2

@echo off
for /f "delims=" %%A in (textfile.txt) do (
    md "C:\Output\%%~pA"
    if not exist "%%~fA\*" echo f | xcopy "%%~fA" "C:\Output\%%~pnxA" /y
)

if not exist "%%~fA\*" гарантирует копирование записи только в том случае, если это не каталог. Подробнее см. в справочнике. Приемы и комментарии

Введите for /? в командной строке, чтобы просмотреть список модификаторов переменных. %%~A удалит окружающие цитаты (если есть) из переменной.

Сообщите о проблеме с запросом xcopy. и исправить №2.

Альтернативная установка, поскольку вам, скорее всего, не понадобятся возможности xcopy.

@echo off
for /f "delims=" %%A in (textfile.txt) do (
    md "C:\Output\%%~pA"
    if not exist "%%~fA\*" copy /y "%%~fA" "C:\Output\%%~pnxA"
)
person David Ruhmann    schedule 22.01.2013
comment
Спасибо, Дэвид! Есть ли способ сделать так, чтобы содержимое папки не копировалось? В основном я хочу, чтобы он скопировал файлы, упомянутые в текстовом файле, даже если в каталоге могут быть файлы, которых нет в файле. Правило, которое я ищу, - если строка является папкой, создайте папку и структуру папок. Если строка является файлом, скопируйте файл в каталог. Приведенный выше код копирует все содержимое папки, а не просто создает папку. - person Andrew; 22.01.2013
comment
Я новичок в пакетном сценарии, поэтому понятия не имею, что происходит! Таким образом, %% ~ pA получит структуру каталогов за вычетом диска и имени файла. Что дает мне %% ~ A? Является ли условие if, которое вы упомянули выше, фрагментом кода? Я не уверен, как он выполняет проверку ... - person Andrew; 22.01.2013
comment
@Andrew Добро пожаловать в пакетное создание сценариев. Будет много головной боли. :) Я обновил свой ответ, и почти для любой команды в командной строке вы можете использовать параметр /? справки, чтобы найти всевозможную полезную информацию. Также см. Мой ответ здесь о некоторых отличных онлайн-ресурсах по пакетному скриптингу. stackoverflow.com/a/14431974/891976 - person David Ruhmann; 22.01.2013
comment
Эта версия не копирует файлы. if not exist "%%~A\" работает, но меня просят указать, являются ли файлы файлами или каталогами. Я подавил запросы перезаписи и указания каталога с помощью команд / y и / i, но теперь он спрашивает, являются ли файлы файлами или каталогами. Я так близок! Какой отличный сценарий! - person Andrew; 22.01.2013
comment
@Andrew К сожалению, это обычная проблема с xcopy. См. Сообщение, которое я добавил к своему ответу, чтобы узнать о нескольких способах решения проблемы. 1. Используйте copy вместо xcopy. 2. Используйте echo f | xcopy для имитации ввода f. 3. Создайте пустой файл перед командой xcopy с echo.>"%%~fA". Я добавил решение 2 к своему ответу, но любое из них будет работать. - person David Ruhmann; 22.01.2013
comment
+1, хотя ваша однострочная версия не совсем эквивалентна многострочной версии, от которой он произошел. В частности, из-за &&: если папка существует, md завершится ненулевым кодом выхода, и последующая команда не будет выполнена. Возможно, это была опечатка, и вы действительно хотели использовать & там. - person Andriy M; 22.01.2013
comment
Кроме того, если вы хотели предложить однострочник для прямого использования в командной строке, вам, вероятно, следует избавиться от @echo off в начале и сжать двойные проценты в одинарные. - person Andriy M; 22.01.2013
comment
@AndriyM Один лайнер не нужен, поэтому я его удалил, но ваши комментарии верны. - person David Ruhmann; 22.01.2013
comment
Мне нравится второе решение с копией вместо xcopy, но оно не копирует файлы. Он говорит, что подкаталог или файл уже существует, и игнорирует копию файла. Я поиграю с ним, когда у меня будет немного времени, чтобы посмотреть, смогу ли я заставить его работать. - person Andrew; 22.01.2013
comment
@Andrew Для всех параметров копирования введите copy /? в командной строке. Эта проблема возникает из-за того, что в пакетных файлах команда копирования по умолчанию равна /-Y. Добавьте /Y к команде копирования в пакетном файле. - person David Ruhmann; 22.01.2013
comment
Я взглянул на параметры и добавил флаг /y для команды копирования. Он просто копирует файловую структуру, а не файлы. echo f ! работает как шарм для xcopy, но я получаю разные результаты, когда запускаю пакет, что я не совсем понимаю. У меня он работал, и через полчаса он вернулся к копированию всего без каких-либо изменений! - person Andrew; 22.01.2013
comment
@Andrew Обновите ответ. Кстати, что вы используете для генерации textfile.txt? Также вы используете какие-либо другие флаги для команды xcopy, кроме /y? - person David Ruhmann; 22.01.2013
comment
Текстовый файл создается другим сценарием, который фильтрует значения, а затем записывает их в текстовый файл (я открыл другой поток здесь). Я попробовал обновленный скрипт с *, и он отлично работает! Большое спасибо за то, что уделили этому время. Надеюсь, ваш ответ будет полезен и другим людям! - person Andrew; 22.01.2013
comment
@ Андрей Рад помочь. :) - person David Ruhmann; 22.01.2013