В иерархии каталогов есть файл 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, потому что в общем случае могут быть и другие файлы, подобные этому.)

2 ответа2

1

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

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

.cppclean

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

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

1

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

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

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

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

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

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

Примечание. Задайте значения переменных источника (Src=) и назначения (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

  • ЕСЛИ

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .