Win 10 XCOPY частичное расширение матча

534
Petr Vepřek

Существует файл с именем README.cppcleanв иерархии каталогов. Я хочу скопировать все *.cppфайлы из дерева каталогов, но не из *.cppcleanфайла.

Все команды ниже копируют файл .cppclean:

xcopy /s /f ..\dirtree\*.cpp xcopy /s /f "..\dirtree\*.cpp " xcopy /s /f ..\dirtree\*.cpp. xcopy /s /f "..\dirtree\*.cpp. " 

Интересно, что команды ниже не копируют это:

xcopy /s /f ..\dirtree\*.c xcopy /s /f ..\dirtree\*.cp xcopy /s /f ..\dirtree\*.cppc xcopy /s /f ..\dirtree\*.cppcl xcopy /s /f ..\dirtree\*.cppcle xcopy /s /f ..\dirtree\*.cppclea 

Конечно

xcopy /s /f ..\dirtree\*.cppclean 

также копирует файл .cppclean.

ВОПРОС: Как скопировать все *.cpp(но не *.cppclean) файлы, используя XCOPY? (Я не хочу явно исключать файл .cppclean, потому что в общем случае могут быть и другие файлы, подобные этому.)

0

2 ответа на вопрос

1
Keltari

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

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

.cppclean

Затем используйте команду как это:

xcopy / s / f /exclude:excludedfileslist.txt .. \ dirtree \ cpp

Да, это работает, и спасибо. Тем не менее, я бы хотел, чтобы xcopy соответствовал точному расширению (в данном случае cpp). Поэтому я надеюсь на что-то более общее (чем явное исключение некоторых файлов). Вот почему я попытался добавить пробел после расширения (используя кавычки), но это должно быть удалено и не помогает. PS: .cppclean также исключает .cppclean.cpp? Кажется, это будет ... Petr Vepřek 6 лет назад 0
1
Pimp Juice IT

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

По сути это будет., ,

  • Используйте FOR / F, используя TOKENS=*и реж команду с /sи /b коммутаторами для обхода каталогов с .cppфайлами рекурсивно, которые будут скопированы.

  • Оттуда используйте условную логику IF, чтобы проверить с помощью пакетных подстановок переменных, что расширение файла действительно только .cppи если это правда, то оно будет копировать только эти файлы за каждую итерацию цикла.

  • Последняя XCOPYкоманда будет такова, XCOPY /s /f "%Src%\*%~nxF" "%Dst%что она все равно получит явные имена файлов из DIRкоманды, но с подстановочным знаком звездочки перед ней, хотя - условная логика по-прежнему гарантирует, что не будут скопированы никакие другие файлы, кроме именованных файлов .CPP

Командная строка

Примечание. Установите значения переменных source ( Src=) и destination ( Dst=) для своих нужд

SET Src=C:\Users\User\Desktop\CPP SET Dst=C:\CPP2 FOR /F "TOKENS=*" %F IN ('dir /s /b "%Src%\*.cpp"') DO IF %~xF==.cpp ECHO F | XCOPY /s /f "%Src%\*%~nxF" "%Dst%\" 

Дополнительные ресурсы

  • FOR / F

    • FOR /?

       tokens=x,y,m-n - specifies which tokens from each line are to be passed to the for body for each iteration. This will cause additional variable names to be allocated. The m-n form is a range, specifying the mth through the nth tokens. If the last character in the tokens= string is an asterisk, then an additional variable is allocated and receives the remaining text on the line after the last token parsed. 

      Кроме того, была улучшена замена ссылок на переменные FOR. Теперь вы можете использовать следующий необязательный синтаксис:

      %~xI - expands %I to a file extension only 
  • DIR

  • ЕСЛИ
Спасибо за ваш ответ. Я полагаю, что упомянул о нежелании «явно исключать» некоторые файлы в исходном вопросе (и позже в комментарии). Мне нравится ваше предложение, потому что оно не требует какого-либо "нежелательного исключения файла". Тем не менее, я нахожу одну проблему с этим. Структура каталогов, из которых копируются файлы, не реплицируется. Все файлы попадают в один и тот же каталог назначения. (Примечание: использование% ~ pF в качестве части спецификации назначения не помогает, поскольку dir / s перечисляет полный путь каждого файла от буквы диска. Требуются некоторые дополнительные манипуляции ...) Petr Vepřek 6 лет назад 0
@ PetrVepřek Хорошо, я пропустил, так как мой маленький тест проводился с файлами в отдельных подпапках с одинаковыми именами файлов, поэтому я не заметил, так как все структуры и файлы были на месте, когда я тестировал. Я думаю, что я нашел способ, который будет работать здесь: https://justpaste.it/1fu3i, но я не хочу редактировать свой ответ, пока я не подтвердлю, что это решение, которое работает на 100% для вас. Я просто скопировал логику командной строки для той ссылки, которую использовал, но я явно указал путь назначения и исходный путь. По сути, добавляя подстановочный знак `*` к `% ~ nxF` и помещая перед ним`% Src% \ `, получаем ожидаемый результат. Pimp Juice IT 6 лет назад 0
Таким образом, последняя команда `XCOPY` выглядит примерно так:` XCOPY / s / f "% Src% \ *% ~ nxF" "% Dst%", поэтому она по-прежнему получает явное имя с подстановочными знаками звездочек перед ней, и условная логика по-прежнему гарантирует, что никакие другие файлы, кроме именованных файлов `.CPP`, не будут скопированы. Я надеюсь, что это поможет вам, и если да, я соответствующим образом обновлю свой ответ. Pimp Juice IT 6 лет назад 1
@ PetrVepřek У меня есть другая идея, если этого будет недостаточно, но просто любопытно, будет ли достаточно быстро настроенного решения, или нет, но у меня есть еще одна вещь, которую я проверю, если это не помогает или вызывает проблему, основанную на повторяющихся или похожих именах файлов. Pimp Juice IT 6 лет назад 0
Хорошее время! :-) Я был вне сети в течение нескольких дней и только что вернулся, увидел ваш комментарий, и на самом деле дал ему понять, когда пришел ваш последующий комментарий. В моем крошечном тесте ваше предложение сработало, как и ожидалось. Ницца! Но помните, я еще не проверил это полностью. Petr Vepřek 6 лет назад 0
@ PetrVepřek Ах .... Не беспокойся, я рад услышать от тебя, несмотря ни на что. Не торопитесь и будьте осторожны с этим наверняка. Ударь меня, как только вы поймете, в любом случае, и я буду ждать, чтобы услышать ваш результат и результат. Pimp Juice IT 6 лет назад 0
Пока ваше решение работает для меня. Если вы обновите свой ответ, я приму его. (Хотелось бы, чтобы был способ «исправить / обойти» тот факт, что xcopy не соответствует исходному расширению, как ожидалось, то есть * .cpp копирует файлы * .cpp и * .cppclean, в то время как * .cp также не копирует. это за один раз будет быстрее, чем итерация ... Однако итерация лучше, чем неожиданные результаты. :-) Petr Vepřek 6 лет назад 0
@ PetrVepřek Я обновил свой ответ, как вы и просили. Pimp Juice IT 6 лет назад 0