Xcopy exclude не удается прочесть файл

Обновлено: 05.07.2024

задача postbuild для одного из наших решений использует xcopy для перемещения файлов в общий каталог артефактов сборки. По какой-то причине на моем компьютере (и на виртуальной машине, которую я тестировал) xcopy терпит неудачу с "отказано в доступе". Вот что я сделал, чтобы попытаться изолировать проблемы:

  • я попробовал обычную копию; это работает.
  • Я дважды проверил, что ни один из файлов были только для чтения.
  • Я проверил разрешения как на источник, так и на назначение Папка; я полностью контролирую оба.
  • Я попытался вызвать xcopy из командной строки, если процесс сборки VS заблокировал файл.
  • я использовал Unlocker и Process Explorer, чтобы определить, что в исходном файле не было блокировок.

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

проблема решена; есть две части головоломки.

переключатель /O требует повышения на Vista. Кроме того, я заметил, что xcopy устарел в Vista в пользу robocopy. Сейчас я говорю об этом с нашими инженерами-строителями.

Это было мое разрешение этой ошибки.

обычно это происходит потому, что есть другой процесс блокировки файла. Бьюсь об заклад, ваша машина имеет другое количество ядер / другую скорость, чем другие. Попробуйте вставить некоторые спальные места, чтобы увидеть, решает ли это проблему.

вам нужно запустить XCOPY как администратор, нет никакого способа обойти это.

если вы не хотите запускать свою копию как администратор, вы должны использовать ROBOCOPY.

обратите внимание, однако, что с ROBOCOPY очень заманчиво использовать /COPYALL переключатель, который копирует информацию аудита, а также и требует "управление правом пользователя аудита", который снова приглашает вас работать от имени администратора в качестве быстрого решения. Если вы не хотите запускать свою копию как Администратор, тогда не используйте the /COPYALL (или /Copy:DATSOU ) переключатель. Вместо этого используйте /Copy:DATSO , поскольку U означает аудит.

также обратите внимание, что если вы копируете из NTFS в файловую систему FAT, вы не можете "скопировать NTFS Security в целевой каталог/файл".

Если вы можете удалить файл в Проводнике Windows, попробуйте через командную строку. Не уверен, почему Проводник Windows не запрашивает разрешение здесь для операции удаления, которая требует прав администратора через cmd.

Я пытаюсь запустить xcopy, который копирует файлы, исключая .obj, и т. Д. Я вижу, что Microsoft.Practices.ObjectBuilder.dll не копируется, если мой файл excludes.txt содержит расширение .obj. Когда .obj удаляется, Microsoft.Practices.ObjectBuilder.dll копируется правильно. Однако этого не происходит с другими DLL.

Кто-нибудь знает, почему это могло произойти?

4 ответа

Я предполагаю, потому что подстрока .obj находится в имени Microsoft.Practices **. Obj ** ectBuilder.dll, и поскольку Windows не чувствительна к регистру, она исключит ее.

Спасибо Андре! MS Doc противоречит тому, что происходит на самом деле: «Если вы укажете строку« .obj », вы исключите все файлы с расширением .obj». любопытно, есть ли способ обойти проблему . Я рекурсивно копирую из корневого каталога - мне нужно включить .asmx, .configs и т. Д., Но я хочу пропустить промежуточные файлы.

Да уж, xcopy такой тупой.

Хотя иногда с этим все еще будет проблема.

Например, если у вас есть файл с именем Practices.ob j, он не будет его копировать, но также не сможет скопировать ваш Microsoft. Practices.Obj ectBuilder. dll

Удобный трюк заключается в том, что если вы укажете / s в dir, вы получите рекурсию и полный путь, а затем, если вы полностью укажете исходный каталог в xcopy, исключения должны будут совпадать с самого начала:

Теперь Microsoft.Practices.ObjectBuilder.dll не сможет скопировать, только если у вас есть файл Microsoft.Practices.obj в том же каталоге. Возьми?

XCOPY устарел сейчас в любом случае, поэтому я сомневаюсь, что что-то будет исправлено. Взгляните на ROBOCOPY - он встроен в Vista и входит в комплект ресурсов для 2003 и XP.

Ответ заключается в том, что вы можете получить, набрав:

/ EXCLUDE: файл1 [+ файл2] [+ файл3] .
Задает список файлов, содержащих строки. Каждая строка должен быть отдельной строкой в ​​файлах. Когда любой из строки соответствуют любой части абсолютного пути к файлу, который должен быть скопировано, этот файл будет исключен из копирования. Для Например, указание строки типа \ obj \ или .obj исключает все файлы в каталоге obj или все файлы с .obj расширение соответственно.

У меня есть пакетный файл для копирования файлов из Visual Studio в мою веб-папку. Я хочу скопировать все файлы в моем веб-проекте, КРОМЕ для файлов * .cs. Я не могу заставить это работать:

Есть советы? Я просто получаю код выхода 4, когда пытаюсь запустить это.

4 ответа

Аргумент /EXCLUDE: ожидает файл, содержащий список исключенных файлов.

Итак, создайте файл с именем «excalfileslist.txt», содержащий:

Тогда такая команда:

Кроме того, вы можете использовать Robocopy , но потребует установки /копирования robocopy.exe на компьютеры.

Редактирование анонимного комментария, в котором просто говорится: «Это решение исключает также файл CSS!»

Это правда, что создается файл "excalfileslist.txt", содержащий только:

(обратите внимание, что в конце нет обратной косой черты)

Также исключит все следующее:

    file1.cs литий> file2.css литий> dir1.cs\file3.txt литий> dir2\anyfile.cs.something.txt литий>

Иногда люди не читают или не понимают справку команды XCOPY, вот что я хотел бы выделить:

  • Перечислите каждую строку в отдельной строке в каждом файле. Если какая-либо из перечисленных строк соответствует какой-либо части абсолютного пути копируемого файла, этот файл затем исключается из процесса копирования. Например, если вы укажете строку «\ Obj \», вы исключите все файлы из каталога Obj. Если вы укажете строку «.obj», вы исключите все файлы с расширением .obj.

Как показывает пример, он исключает all files with the .obj extension , но не утверждает, что он также исключает файлы или каталоги с именем file1.obj.tmp или dir.obj.output\example2.txt .

Есть способ обойти файлы .css , которые также исключаются, замените файл "excalfileslist.txt" на просто:

(обратите внимание на обратную косую черту в конце).

Вот полная последовательность тестов для вашей справки:

Этот тест был выполнен в командной строке Windows 7 и повторно протестирован в Windows 10 «10.0.14393».

Обратите внимание, что в последнем примере исключено .\src\dir2.cs\file5.txt , которое может быть или не быть неожиданным для вас.

В моем случае мне пришлось начинать список исключаемых расширений из второй строки, потому что xcopy проигнорировал первую строку.

Измените * .cs на .cs в excludefileslist.txt

Для исключения нескольких типов файлов вы можете использовать '+' для объединения других списков. Например:

Команда XCOPY используется для копирования файлов и каталогов с сохранением их структуры. По сравнению с командой COPY имеет более широкие возможности и является наиболее гибким средством копирования в командной строке Windows

Формат командной строки:

XCOPY источник [целевой_объект] [/A | /M] [/D[:дата]] [/P] [/S [/E]] [/V] [/W] [/C] [/I] [/Q] [/F] [/L] [/G] [/H] [/R] [/T] [/U] [/K] [/N] [/O] [/X] [/Y] [/-Y] [/Z] [/B] [/EXCLUDE:файл1[+файл2][+файл3]. ]

Параметры командной строки:

источник - Копируемые файлы.

целевой_объект - Расположение или имена новых файлов.

/A - Копирование только файлов с установленным архивным атрибутом; сам атрибут при этом не изменяется.

/M - Копирование только файлов с установленным архивным атрибутом; после копирования атрибут снимается.

/D:m-d-y - Копирование файлов, измененных не ранее указанной даты. Если дата не указана, заменяются только конечные файлы, более старые, чем исходные.

/EXCLUDE:файл1[+файл2][+файл3]. - Список файлов, содержащих строки с критериями для исключения файлов и папок из процесса копирования. Каждая строка должна располагаться в отдельной строке файла. Если какая-либо из строк совпадает с любой частью абсолютного пути к копируемому файлу, такой файл исключается из операции копирования. Например, указав строку \obj\ или .obj, можно исключить все файлы из папки obj или все файлы с расширением OBJ соответственно.

/P - Вывод запросов перед созданием каждого нового файла.

/S - Копирование только непустых каталогов с подкаталогами.

/E - Копирование каталогов с подкаталогами, включая пустые. Эквивалентен сочетанию ключей /S /E. Совместим с ключом /T.

/V - Проверка размера каждого нового файла.

/W - Вывод запроса на нажатие клавиши перед копированием.

/C - Продолжение копирования вне зависимости от наличия ошибок.

/I - Если целевой объект не существует и копируется несколько файлов, считается, что целевой объект задает каталог.

/Q - Запрет вывода имен копируемых файлов.

/F - Вывод полных имен исходных и целевых файлов.

/L - Вывод имен копируемых файлов.

/G - Копирование зашифрованных файлов в целевой каталог, не поддерживающий шифрование.

/H - Копирование, среди прочих, скрытых и системных файлов.

/R - Перезапись файлов, предназначенных только для чтения.

/T - Создание структуры каталогов без копирования файлов. Пустые каталоги и подкаталоги не включаются в процесс копирования. Для создания пустых каталогов и подкаталогов используйте сочетание ключей /T /E.

/U - Копирование только файлов, уже имеющихся в целевом каталоге.

/K - Копирование атрибутов. При использовании команды XСOPY обычно сбрасываются атрибуты "Только для чтения".

/N - Использование коротких имен при копировании.

/O - Копирование сведений о владельце и данных ACL.

/X - Копирование параметров аудита файлов (подразумевает ключ /O).

/Y - Подавление запроса подтверждения на перезапись существующего целевого файла.

/-Y - Запрос подтверждения на перезапись существующего целевого файла.

/Z - Копирование сетевых файлов с возобновлением.

/B - Копирование символической ссылки вместо ее целевого объекта.

/J - Копирование с использованием небуферизованного ввода/вывода. Рекомендуется для очень больших файлов.

Ключ /Y можно установить через переменную среды COPYCMD.

Ключ /-Y командной строки переопределяет такую установку.

Примеры использования XCOPY

XCOPY /? - выдать краткую справку по использованию команды.

Что означает D:\copy1:
имя файла или каталога
(F = файл, D = каталог)? D

После ответа D целевой каталог будет создан и копирование будет выполняться в D:\COPY1\. Для подавления запроса на создание целевого каталога используется параметр /I:

xcopy C:\users D:\copy1 /I

xcopy C:\users D:\copy1 /H /Y /C - копирование файлов, включая скрытые и системные, с подавлением запроса на перезапись существующих и возобновлением при ошибке. Если существующий в целевом каталоге файл имеет атрибут "Только чтение", то копирование не выполняется. Для перезаписи таких файлов используется ключ /R

xcopy C:\users D:\copy1 /H /Y /C /R /S - скопировать все файлы и подкаталоги ( /S ) с перезаписью существующих без запроса ( /Y ) , включая скрытые и системные. ( /H ) с перезаписью файлов с атрибутом "Только чтение" (/R) и игнорированием ошибок ( /C )

xcopy C:\users D:\copy1 /H /Y /C /R /S /EXCLUDE:C:\users\listnotcopy.txt - то же, что и в предыдущем случае, но текстовый файл C:\users\listnotcopy.txt задает признаки исключения из процедуры копирования. Пример содержимого файла:

\User1\ - исключить из копирования каталог C:\users\user1
All Users исключить из копирования каталог C:\users\All Users
de*.* - исключить из копирования все файлы и каталоги, начинающиеся на буквосочетание "de"

xcopy C:\users\*.exe D:\copy1 /H /Y /C /R /S /EXCLUDE:C:\users\listnotcopy.txt - то же, что и в предыдущем примере, но выполняется только копирование исполняемых файлов с расширением .exe .

xcopy %TEMP%\*.ini D:\copy1\ini /H /Y /C /R /S /I - копирование всех файлов с расширением .ini из каталога временных файлов в каталог D:\copy1\ini\ . Если целевой подкаталог \ini\ не существует, то он будет создан без запроса пользователю ( /I ) .

xcopy %TEMP%\*.ini D:\copy1\ini /H /Y /C /R /S /I /D:09-16-2013 - то же, что и в предыдущем примере, но выполняется копирование только тех файлов, у которых установлена дата изменения 16 сентября 2013 года и старше.

xcopy C:\ D:\copy1\LISTDIR /H /Y /C /R /S /I /E /T - создать структуру папок диска C: в каталоге D:\copy1\LISTDIR . Копирование файлов не выполняется. Копируются только папки, включая пустые, скрытые и системные.

xcopy C:\ D:\copy1\LISTDIR /H /Y /C /R /S /I /E /T /D:09-16-2013 воссоздать в каталоге D:\copy1\LISTDIR структуру папок диска C: , с датой изменения 16 сентября 2013 года и позже.

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

Читайте также: