xcopy file, переименовывает, подавляет сообщение «xxx определяет имя файла…»

404

Это кажется довольно простым, и, может быть, я просто пропускаю правильный флаг , но как мне в одной команде скопировать файл из одного каталога в другой и переименовать его в целевой каталог? Вот моя команда:

if exist "bin\development\whee.config.example"
  if not exist "TestConnectionExternal\bin\Debug\whee.config"
    xcopy "bin\development\whee.config.example"
          "TestConnectionExternal\bin\Debug\whee.config"

Каждый раз мне подсказывают следующее:

Указывает ли TestConnectionExternal \ bin \ Debug \ whee.config имя файла или имя каталога на целевом объекте (F = файл, D = каталог)?

Я хочу подавить это приглашение; ответ всегда F.

Сара Весселс
источник
15
эхо е | xcopy ...
Циклион
downvote, почему вы даже используете xcopy, если копирование делает то, что вы хотите
barlop
3
Miscrosoft : «Зачем делать что-то простое, если это может сбить с толку ваших пользователей?». Это время, когда они должны просто скопировать то, что делается в мире Linux, смотрите на cpb ** t для копирования файлов / каталогов вокруг!
fduff
Я рекомендую прочитать мой ответ в файле BATCH, запрашивая файл или папку, подробно объясняя, когда отображается приглашение, и как на него можно автоматически ответить, независимо от языка ОС пакетного файла.
Mofi

Ответы:

217

Не используйте xcopy, используйте copyвместо этого, у него нет этой проблемы.

xcopyобычно используется при выполнении рекурсивных копий нескольких файлов / папок или когда вам нужны функции проверки / запроса, которые он предлагает. Для отдельных файлов, copyкоманда работает просто отлично.

LBushkin
источник
97
copyне будет копировать файл, если вся структура каталогов для места назначения еще не существует. xcopyавтоматически создаст все необходимые каталоги.
БК.
41
Это удивительно , что хсор имеет это упущение. Если бы у него просто была опция для файлов, как у каталогов (/ I), это было бы решено, и xcopy мог бы стать отличной заменой для копирования. Вместо этого, из-за этого дефекта, вы должны выбрать копию для этих ситуаций.
rocketmonkeys
35
Как уже отмечали другие, ответ @ Arnshea является правильным. Это связано с тем, что a) конкретное обстоятельство OP, заключающееся в наличии структуры каталогов, не упоминалось в этом вопросе, и b) гораздо более ценно для будущих читателей этого вопроса, которые придут сюда в поисках ответа, xcopyа не только copy,
Майк Накис
17
Ну, ответ @ Амши тоже правильный, потому что вопрос специфичен для xcopy, и этот ответ в основном "не используйте xcopy". Неужели вообще не отвечает на вопрос о xcopy, не так ли?
BrainSlugs83
9
Просто добавьте звезду в конце пути для цели. Посмотрите на этот ответ ниже. stackoverflow.com/a/26034267/1231
Донни В.
638

я использую

echo f | xcopy /f /y srcfile destfile

обойти это.

Shea
источник
17
@ Arnshea - спасибо! Адаптировано для тихого копирования каталогаecho d | xcopy srcdirectory destdirectory /S
Dr. ABT
8
+1 @ Arnshea мне потребовалось некоторое время, чтобы понять, что вы именно там делаете, и так как я работаю над установкой немецких окон echo d | xcopy ...для меня. Вы великолепны
Томас
23
Он имитирует ответ пользователя на вопрос, который задаст xcopy.
Джон Мюнш
5
@Thomas Означает ли это, что командный файл, использующий эту технику, не будет переносимым в разные локали?
Макс Нанаси
17
@MaxNanasy Я подтвердил, что это не переносимо во всех регионах. В немецкой установке вы передаете D для файла или V для каталога. :(
Мэтт
177

Другим вариантом является использование подстановочного знака назначения. Обратите внимание, что это работает только в том случае, если имена файлов источника и назначения будут одинаковыми, поэтому, хотя это не решает конкретный пример OP, я подумал, что стоит поделиться.

Например:

xcopy /y "bin\development\whee.config.example" "TestConnectionExternal\bin\Debug\*" 

создаст копию файла «whee.config.example» в целевом каталоге без запроса файла или каталога.

Обновление : как упомянуто @chapluck:

Вы можете изменить "* "на "[newFileName].*". Сохраняется расширение файла, но можно переименовывать. Или более хакерский: "[newFileName].[newExt]*"поменять расширение

zippycoder
источник
1
"Эхо F |" Это круто, но это позволяет избежать лишних выводов, которые я часто ищу, чтобы найти проблемы, во-первых.
Ричард Энтони Хейн
6
@ Durden81 - как указывает zippycoder, их ответ не переименовывает файл, что было требованием OP.
Полифун
6
Чтобы расширить ответ, я бы изменил «*» на «[newFileName]. *». Сохраняется расширение файла, но можно переименовывать. Или более хакерский: «[newFileName]. * [NewExt]» для изменения расширения.
Чаплак
Спасибо! Раздел обновления - это то, что решило мою проблему: нужно было изменить имя файла, сохранив расширение и предположив, что это файл. XCopy должен был иметь это в качестве переключателя.
Станислав
1
Работал у меня без звездочки в конце, просто обратная косая черта.
tivnet
91

В XCOPY есть какая-то недокументированная особенность. ты можешь использовать:

xcopy "bin \ development \ whee.config.example" "c: \ mybackup \ TestConnectionExternal \ bin \ Debug \ whee.config *"

Я проверил это только сегодня. :-)

ienaxxx
источник
4
Большое спасибо. Я добавил "*" в конце файла назначения, и это сработало .. :) +1 за трюк
Рахул Патель
2
Отличное решение - чисто, элегантно, не использует другую команду, совместимо с существующими флагами xcopy, работает безупречно. Это должен быть самый популярный ответ.
Брайан Свифт
7
Ответ неправильный, команда приведет whee.config.exampleк папке назначения, потому что whee.config*совпадает whee.config.example.
мяу
2
Я только что создал файл b.txtxt, а затем запустил команду, xcopy a.txt b.txt* /F /Yи файл a.txtбыл скопирован b.txt, как и ожидалось. Кроме того, при использовании /F /Yпереключателей фактическая копия отображается на экране точно так, как ожидалось.
Доминик
1
@Meow: нет, так как подстановочный знак находится в месте назначения, а не в источнике.
ienaxxx
74

Просто зайдите на http://technet.microsoft.com/en-us/library/bb491035.aspx

Вот что такое ОСНОВНАЯ ПРОБЛЕМА "... Если в пункте назначения нет существующего каталога и он не заканчивается обратной косой чертой (), появляется следующее сообщение: ...

Указывает ли пункт назначения имя файла или имя каталога на цели (F = файл, D = каталог)?

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

Это заняло у меня некоторое время, но все, что нужно, это RTFM.

Билл
источник
7
Это должен быть главный ответ! Просто чтобы быть действительно понятным для других. Если вы копируете ОДИН файл из одного места в другое И хотите, чтобы была создана полная структура каталогов, используйте следующую команду: xcopy / "C: \ Data \ Images \ 2013 \ 08 \ 12 \ 85e4a707-2672-481b-92fb -67ecff20c96b.jpg "" C: \ Target Data \\ Images \ 2013 \ 08 \ 12 \ 85e4a707-2672-481b-92fb-67ecff20c96b.jpg \ ". Да, ставьте обратную косую черту в конце имени файла!
Adudley
4
Хороший ответ, но не решает проблему. Я попробовал xcopy hello.txt hello2 \. Нет подсказки. Теперь я попробую xcopy hello.txt hello3 (без обратной косой черты). Это подсказывает мне, является ли dest файлом или dir. Мне нужен способ сказать ему, чтобы предполагать F или D в сценарии.
RuntimeException
27
Это очень странный ответ, особенно из-за возражений, бесполезной «RTFM» и комментариев, излагающих «популярные» ответы ... так как это не касается первоначального вопроса! В первоначальном вопросе четко говорилось: «скопируйте файл из одного каталога в другой и переименуйте его в целевой каталог». Представленный выше предпринятый попытка ответа, по-видимому, относится к другому случаю копирования файла с именем файла назначения, являющимся одним и тем же именем в качестве исходного файла. «Грязный» обходной путь, предложенный @Arnshea, является единственным одношаговым ответом, который я вижу здесь, - таким образом, его «популярность».
М.Бёрден
3
Г-н Бирден был довольно вежлив, но, учитывая количество голосов «за», я чувствую необходимость четко перечислить проблемы с этим ответом: 1) пункт 1, который, по-видимому, дает решение проблемы ОП (пункт 4 из 5), это не работает, потому что ОП является копирование и переименование в файл , а не каталог; 2) ссылка, указанная в верхней части ответа, не дает решения; 3) утверждение основного вопроса вовсе не применяется на вопрос ФП в; и 4) ответ оскорбительный, с криками во втором абзаце и оскорблениями в последнем. Возможно, ему следовало бы перечитать вопрос.
GlennFromIowa
2
Все ответы, приведенные здесь, предназначены для копирования в каталог, а не для копирования в файл назначения, что возможно и недокументировано, см. Другой ответ от zippycoder, chapluck, LBushkin
pdem
27

Таким образом, есть простое решение для этого. Это по общему признанию неловко, но это работает. xcopy не предложит узнать, является ли место назначения каталогом или файлом, ЕСЛИ новый файл (имя файла) уже существует. Если вы предшествуете своей команде xcopy простым эхом новому имени файла, он перезапишет пустой файл. пример

echo.>newfile.txt
xcopy oldfile.txt newfile.txt /Y
DaveD
источник
6

Это из вексельного ответа.

Просто чтобы быть действительно понятным для других.

Если вы копируете ОДИН файл из одного места в другое И хотите, чтобы была создана полная структура каталогов, используйте следующую команду:

xcopy "C:\Data\Images\2013\08\12\85e4a707-2672-481b-92fb-67ecff20c96b.jpg" "C:\Target Data\\Images\2013\08\12\85e4a707-2672-481b-92fb-67ecff20c96b.jpg\" 

Да, поставьте обратную косую черту в конце имени файла, и она НЕ спросит вас, является ли это файл или каталог. Поскольку в источнике только один файл, он будет считать, что это файл.

adudley
источник
12
Это не верно. При запуске "xcopy versionBase.txt asd \ versionBase.txt \" и отсутствии каталога asd я получаю файл asd \ versionBase.txt \ versionBase.txt.
Кристиан Никулеску
1
Как и в случае с другими ответами на этой странице, этот пост не касается исходного вопроса. Вопрос был в том, как скопировать И переименовать (за один шаг) файл. Как и в случае с другими явно запутанными ответами, речь идет о том, как скопировать файл БЕЗ переименования.
М.Бёрден,
Не говоря уже о том, что он действительно создает каталог с таким именем, а не папку. Протестируйте его и запустите dir после этого, и вы увидите что-то вроде этого: dir "C:\Target Data\\Images\2013\08\12" 09/25/2015 10:48 AM <DIR> 85e4a707-2672-481b-92fb-67ecff20c96b.jpg
GlennFromIowa
3

xcopy src dest /I

REM This assumes dest is a folder and will create it, if it doesnt exists

jerryh91
источник
2

У меня была похожая проблема, и robocopy и xcopy не помогли, так как я хотел скрыть комментарии и использовать другое имя файла назначения. я нашел

type filename.txt > destfolder\destfilename.txt

работает в соответствии с моими требованиями.

user140185
источник
2

Вернуться к исходному вопросу:

 xcopy "bin\development\whee.config.example" "TestConnectionExternal\bin\Debug\whee.config"

может быть сделано с помощью двух команд, например:

mkdir "c:\mybackup\TestConnectionExternal\bin\Debug\whee.config\.."
xcopy "bin\development\whee.config.example" "c:\mybackup\TestConnectionExternal\bin\Debug\whee.config\"

Просто добавив «\ ..» к пути файла назначения, создается каталог назначения, если он еще не существует. В этом случае

"c:\mybackup\TestConnectionExternal\bin\Debug\"

который является родительским каталогом несуществующего каталога

"c:\mybackup\TestConnectionExternal\bin\Debug\whee.config\.."

По крайней мере для WIN7 mkdir не волнует, если каталог

"c:\mybackup\TestConnectionExternal\bin\Debug\whee.config\"

действительно существует.

grenix
источник
Интересное исправление, если каталог не существует. К сожалению, следующая строка (в моем тестировании) все еще подсказывает пользователю.
GlennFromIowa
Вы правы, это может быть xcopy "bin \ development \ whee.config.example" "c: \ mybackup \ TestConnectionExternal \ bin \ Debug \ whee.config \". Я использовал свой подход, чтобы скопировать файлы в dirotory, которые могут не существовать. Для переименования похоже, что в конце нужно добавить обратную косую черту.
Греникс,
2

XCOPY с * в конце цели для копирования файлов, независимо от того, существуют они или нет в месте назначения. XCOPY с \ в конце цели для копирования папок и содержимого, независимо от того, существуют они или нет в месте назначения.

альтернативно

RoboForm SOURCE DEST FILE для файлов RoboForm SOURCE DEST для файлов

Колин Хей
источник
1

Я предлагаю robocopyвместо copyили xcopy. Используется в качестве команды или в графическом интерфейсе на клиентах или серверах. Допускает сетевые паузы, и вы можете игнорировать атрибуты файла при копировании копии по атрибутам файла. Да, и он поддерживает многоядерные машины, поэтому файлы копируются гораздо быстрее, параллельно, а не последовательно. robocopyможно найти на MS TechNet.

surferdj
источник
2
Я пользуюсь robocopy все время. Однако, для вопроса этого автора, он не будет работать, так как не может переименовывать файлы. Сегодня я не знал, что в xcopy есть переключатель / z, который допускает паузы в сети!
GlennFromIowa
1

Правильно, если вы хотите скопировать только файл и изменить его имя в месте назначения:

xcopy / f / y "bin \ development \ example.exe" "TestConnectionExternal \ bin \ Debug \ NewName.exe *"

И это будет работать нормально

Танос
источник
1

Для дублирования больших файлов хорошим выбором будет xopy с ключом / J. В этом случае просто передайте F для файла или D для каталога. Кроме того, вы можете сохранить задания в массиве для будущих ссылок. Например:

$MyScriptBlock = {
    Param ($SOURCE, $DESTINATION) 
    'F' | XCOPY $SOURCE $DESTINATION /J/Y 
    #DESTINATION IS FILE, COPY WITHOUT PROMPT IN DIRECT BUFFER MODE
}
JOBS +=START-JOB -SCRIPTBLOCK $MyScriptBlock -ARGUMENTLIST $SOURCE,$DESTIBNATION
$JOBS | WAIT-JOB | REMOVE-JOB

Спасибо Чанду с небольшими изменениями: https://stackoverflow.com/users/3705330/chand

MAZDA
источник
0

Используйте copy вместо xcopy при копировании файлов.

например, скопируйте «bin \ development \ whee.config.example» «TestConnectionExternal \ bin \ Debug \ whee.config»

Питер
источник
1
Я пытаюсь скопировать файл в ту же папку с другим именем, и xcopy не может работать. Я использую, copy /Y source destinationчтобы передать подтверждение перезаписи.
SandRock
0

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

xcopy bin\development\whee.config.example TestConnectionExternal\bin\Debug\  /Y

Этот подход хорошо работает, когда каталог назначения гарантированно существует, и когда источником может быть файл или каталог.

Simmo
источник
1
@ downvoters: Почему этот ответ мог быть опущен? В этом контексте Debugкаталог, вероятно, гарантированно существует.
Джирка Ханика
4
В этом ответе говорится: «поскольку вы на самом деле не меняете имя файла», тогда как в первоначальном вопросе четко говорилось: «скопируйте файл из одного каталога в другой и переименуйте его в целевой каталог». Так что это не имеет отношения к теме.
М.Бёрден
0

Обойдите, используйте ReName ... и назовите его загадочным именем, затем переименуйте его на собственное имя

C:

CD "C: \ Users \ Public \ Documents \ Мои веб-сайты \ AngelFire ~ Zoe \"

XCopy / D / I / V / Y "C: \ Users \ Public \ Documents \ Мои веб-сайты \ HostGator ~ ZoeBeans \ cop.htm"

Ren "cop.htm" "christ-our-passover.htm"

JollyChollie
источник
0

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

ren "bin \ development \ whee.config.example" whee.config

xcopy / R / Y "bin \ development \ whee.config" "TestConnectionExternal \ bin \ Debug \"

Чак Эмануэль
источник
Предполагая, что это будет работать в конкретной среде (т. Е. В исходной папке наверняка не будет whee.config), для репликации кода OP не следует ли включить переименование обратно в исходное имя? ren "bin\development\whee.config" whee.config.example
GlennFromIowa
0

Поместите звездочку (*) в конце пути назначения, чтобы пропустить спор D и F.

Пример:

xcopy "ressedOutput.xml "" ../../Execute Scripts / APIAutomation / Библиотеки / rerunlastfailedbuild.xml * "

Икра.
источник
0

Xxxxxxxxxxxx указывает имя файла или имя каталога на цели

(F = file, D = directory)? D

if a File : (echo F)
if a Directory (echo D)
Дания аль Халил
источник
0

Я столкнулся с той же проблемой при попытке скопировать файл с новым именем, только если файл не существует в месте назначения или существует (с новым именем), но старше. Решение состоит в том, чтобы добавить *символ в конце имени файла назначения. Пример:

xcopy "C:\src\whee.config.txt" "C:\dest\bee.config.txt*" /D /Y
Иван Александров
источник
Это работает как шарм,
спасибо
-2

Вы не можете указать, что это всегда файл. Если вам не нужны другие функции xcopy, почему бы не использовать обычные copy?

Гейб
источник
5
Одна из причин в том copy, что , будучи внутренней командой, не устанавливает ErrorLevel. Если вы хотите иметь возможность влиять на путь пакетного файла, если происходит ошибка копирования, вам нужно использовать XCOPY.
rossmcm
2
Другая причина, если вы хотите использовать другие функции xcopy, например, / d
Victoria