xcopy не создает структуру каталогов

У меня странная проблема с xcopy в Windows XP Professional. Я не знаю, глупый ли это вопрос, поскольку я указываю только файл в качестве источника, так что я должен ожидать какого-либо другого поведения? Это оно:

Я использую xcopy <src> <dest> /s/y.

<src>=C:\sourcefolder\a\b\c\d\something.java и

<dest>=C:\destinationfolder.

Теперь xcopy копирует файл, но не создает структуру каталогов \a\b\c\d\ внутри C:\destinationfolder.

я хочу C:\destinationfolder\a\b\c\d\something.java и

то, что я получаю, это C:\destinationfolder\something.java


  1. Я попытался запустить его в папке назначения C:\destinationfolder, указав . для целевой папки.
  2. Пробовал без какой-либо цели выше

У меня есть сценарий, который итеративно вызывает xcopy, поэтому у меня остается C:\destinationfolder\many java files без какой-либо структуры каталогов.

О. Да, я сделал xcopy /?, чтобы увидеть все варианты

B. /T также не создает пустой структуры каталогов

C. Не могу зайти в исходную папку a\b\c\d\ и запустить xcopy . <dest>


person Pulak Agrawal    schedule 29.11.2011    source источник
comment
Я не понимаю, где проблема? Если вы копируете из C:\myfolder\a\b\c\d, а папка назначения — C:\myfolder, то зачем создавать какую-либо структуру каталогов, если она уже существует?   -  person Bali C    schedule 29.11.2011
comment
@BaliC извините, если я не очень ясно выразился ... структура папок назначения в настоящее время не существует. Я изменил исходный вопрос, чтобы сделать его более понятным. И я вижу, что вы здесь говорите; вот что я имел в виду, когда писал I don't know if its a stupid question as I am specifying only a file as the source, so should I even expect any other behavior   -  person Pulak Agrawal    schedule 30.11.2011
comment
Спасибо за разъяснения, теперь я понимаю, смотрите мой ответ ниже, надеюсь, это поможет.   -  person Bali C    schedule 30.11.2011


Ответы (6)


ОБНОВИТЬ

Я удалил свой предыдущий ответ об использовании ROBOCOPY. Я считаю, что следующее будет делать то, что вы хотите, используя XCOPY.

Предполагая, что ваша структура папок выглядит следующим образом:

SOURCE = C:\MyJavaStuff\A\B\C\D\something.java
DEST   = C:\MyDestination

Запустите XCOPY следующим образом:

XCOPY C:\MyJavaStuff\something*.java C:\MyDestination /S /E

Обратите внимание на * в something*.java.

person aphoria    schedule 29.11.2011
comment
Я знаю о ROBOCOPY. Не позволили нам это. Все равно спасибо за подсказку - person Pulak Agrawal; 30.11.2011
comment
@PulakAgrawal Я обновил свой ответ решением, в котором используется XCOPY. - person aphoria; 30.11.2011
comment
Это по-прежнему не работает, если целевая папка не существует. - person Violet Giraffe; 19.04.2017

Проблема в том, что вы указываете, какой файл копировать в источнике. В этом случае xcopy не создаст структуру папок. Однако, если вы измените вызов xcopy на

xcopy *.java C:\myfolder /s/y

он также скопирует файлы .java и структуру папок. Вам нужно указать подстановочный знак, чтобы этот вызов работал так, как вы хотите. Если вы хотите копировать только определенные файлы, вам придется настроить вызов xopy, например:

xcopy something.jav* C:\myfolder /s/y

Редактировать

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

FOR /F "tokens=* delims=," %F in (d:\test\list.txt) DO xcopy src\%~nxF* .\dest /S /Y

Что делает эта команда, так это читает текстовый файл (в данном случае "d:\test\list.txt"), читает каждую строку и для каждого файла запускает xcopy, добавляя подстановочный знак в конце имени файла, чтобы убедиться, что он создает структуру папок.

Я предполагаю здесь, что:

  • Вы можете получить список файлов в текстовом файле только с именами файлов (и, возможно, с путями)
  • Вы знаете исходную папку ("C:\sourcefolder" в вашем примере, структуру папок "a\b\c\d" знать не обязательно) и можете использовать ее в команде FOR.

Вы также можете использовать следующую форму:

FOR /F "tokens=* delims=," %F in ('cmd') DO xcopy src\%~nxF* .\dest /S /Y

где cmd нужно заменить командой, которую вы используете для создания списка файлов для копирования.

Обратите внимание: если вы используете эту команду FOR в пакетном файле, вам необходимо заменить %F на %%F%~nxF* на %%~nxF*).

person Laf    schedule 29.11.2011
comment
Я уже упоминал в пункте C, что я не могу перейти к исходному файлу и запустить команду. Но, исходя из вашей точки зрения, если я смогу запустить команду из исходного местоположения C:\sourcefolder\a\b\c\d\ , вы скажете, что она БУДЕТ создать структуру папок назначения, сделав ее C:\destinationfolder\a\b\c\d\ . Что меня интересует, так это найти способ сделать то же самое, сидя в месте назначения C:\destinationfolder или где-либо еще на C: КРОМЕ исходной папки. - person Pulak Agrawal; 30.11.2011
comment
Также посмотрите на мой разговор с Бали С выше, стоит ли вообще заниматься этим вопросом? - person Pulak Agrawal; 30.11.2011
comment
Вам не нужно идти в исходное местоположение. Если вы используете имя файла с подстановочным знаком (*.java или something.jav*) и используете параметр /s, xcopy будет автоматически искать файлы, соответствующие этому имени файла, в текущей папке и во всех подпапках. - person Laf; 30.11.2011
comment
Ценю ответ, но не могу этого сделать. Я получаю список исходных файлов точно так же, как вывод другой команды (файлы, созданные после определенной даты), и никакое * дело не сработает :( - person Pulak Agrawal; 01.12.2011

Я просмотрел переключатели xcopy, и вы можете скопировать структуру каталогов с помощью /T, хотя это не копирует пустые каталоги, которые вы можете переопределить с помощью /E. Таким образом, ваша команда будет выглядеть так:

xcopy C:\sourcefolder\a\b\c\d\something.java C:\destinationfolder /T /E /S /Y

Надеюсь это поможет!

person Bali C    schedule 30.11.2011
comment
спасибо, но еще раз я упомянул в B. выше, что /T не создает для меня пустых.. В основном я пробовал большинство, если не все переключатели в XCOPY. Это как-то связано с тем, как я вызываю команду или откуда я ее вызываю. - person Pulak Agrawal; 30.11.2011
comment
Я знаю, что вы упомянули переключатель /T, но не были уверены, пробовали ли вы /E, т. к. я не уверен, как вы можете это сделать, извините! - person Bali C; 30.11.2011

Чтобы получить C:\destinationfolder\a\b\c\d\something.java, XCOPY нужно знать, сколько C:\sourcefolder\a\b\c\d\something.java дублировать.

Вы можете использовать:

C:
cd \sourcefolder
XCOPY something.java* C:\destinationfolder\ /S

Просто имейте в виду, что это может иметь побочный эффект копирования C:\sourcefolder\oops\something.java в C:\destinationfolder\oops\something.java, а также любые другие совпадения для something*.java под C:\sourcefolder\.

person Alan    schedule 30.11.2011
comment
пожалуйста, прочитайте всю ветку, я дважды упомянул - я не могу запустить эту команду из исходной папки. - person Pulak Agrawal; 01.12.2011
comment
XCOPY c:\sourcefolder\something.java* C:\destinationfolder\ /S должен работать независимо от текущей папки (с упомянутой выше оговоркой). - person Alan; 01.12.2011

Мне кажется, что xcopy обычно используется для копирования деревьев каталогов, а не отдельных файлов (хотя это может работать). Кроме того, xcopy воссоздает структуру каталогов в исходной папке в целевой папке. Если xcopy указан параметр /i, предполагается, что папка target является каталогом. Он будет создан, если он не существует, даже если необходимо создать несколько родителей.

У вас есть C:\MyJavaStuff\A\B\C\D\something.java — это ваш источник. Вы хотите получить файл something.java не в C:\destinationfolder, а в C:\destinationfolder\A\B\C\D, так что это ваша цель. У вас даже нет C:\destinationfolder. Это нормально, с /i будет создан весь путь.

xcopy /i c:\MyJavaStuff\A\B\C\D\something.java C:\destinationfolder\A\B\C\D

Если бы something.java был единственным файлом в папке C:\MyJavaStuff, вы также могли бы использовать

xcopy /sei c:\MyJavaStuff C:\destinationfolder

Это воссоздало бы всю древовидную структуру, скопировав ваш файл. Но если в MyJavaStuff есть другие файлы (и папки), они также будут скопированы.

person John Elion    schedule 07.08.2018

Я написал очень похожий пакетный файл, используя xcopy. Возможно, то, что я сделал, поможет вам.

Это команда, которую я использовал:

xcopy "c:\Data Files\Dave's Data\*.*"   "m:\Dave's Data"      /R/D /E/H

В этом случае данные Дэйва в источнике содержат все дерево каталогов, содержащее не менее 50 000 файлов и превышающее 75 ГБ данных. Он отлично работает на Windows XP

Я обнаружил, что /T не нужен, так как копируется дерево каталогов. Я также обнаружил, что /S не нужен, так как /E скопировано каталогов и подкаталогов, включая пустые. Я включил /R для копирования и перезаписи файлов только для чтения в месте назначения. /H скопировал скрытые каталоги. /D скопировал только новые файлы. Я использую это как инструмент для ежедневного резервного копирования своих данных.

Единственная проблема, с которой я столкнулся, заключается в том, что хотя эта команда будет работать в Windows 7 в первый раз, она не будет работать при последующих запусках, когда существует дерево каталогов назначения. Я подозреваю, что это связано с проблемой привилегий, поскольку команда xcopy будет работать при последующих запусках в Windows 7 в окне cmd.exe.

person DWN1952    schedule 07.08.2018