Как скопировать несколько указанных файлов из исходной папки и ее подпапок в папку назначения?

У меня есть исходная папка: c:\prefix\bin

Я хочу скопировать набор указанных файлов из исходной папки и ее подпапок.

Допустим, я хочу скопировать:

bin
... gtsam.dll
... msvcr120.dll
... intel64\
    ... vc12\
        ... tbb.dll

Чтобы быть более понятным, что я хочу скопировать:

.\gtsam.dll .\msvcr120.dll .\intel64\vc12\tbb.dll

В исходном каталоге много файлов и много подкаталогов, которые я не хочу копировать. И все указанные файлы, которые я должен скопировать, не имеют подстановочных знаков. Не все *.dll копировать в c:\dst

Как я могу сделать это наиболее элегантным способом?

Используете copy, xcopy или robocopy?


person Tal    schedule 29.11.2015    source источник


Ответы (2)


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

Пример для FilesList.txt:

gtsam.dll
msvcr120.dll
intel64\vc12\tbb.dll

Вам решать, в каком каталоге хранить этот файл списка с именами файлов для копирования.
Приведенный ниже код ожидает, что этот файл находится в каталоге C:\prefix\bin.

Затем создайте командный файл со следующим кодом:

@echo off
pushd "C:\prefix\bin"
for /F "usebackq delims=" %%F in ("FilesList.txt") do (
    %SystemRoot%\System32\xcopy.exe "%%~F" C:\dst\ /C /H /I /K /Q /R /Y >nul
)
popd

Если цель указана с обратной косой чертой в конце, как здесь сделано, и используется опция /I, консольное приложение xcopy ожидает, что C:\dst является каталогом, и даже автоматически создает всю структуру каталогов для этого каталога, если она еще не существует.

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

@echo off
if not exist "C:\dst" (
    md "C:\dst"
    if errorlevel 1 (
        echo.
        echo Failed to create directory C:\dst
        echo.
        pause
        goto :EOF
    )
)
pushd "C:\prefix\bin"
for /F "usebackq delims=" %%F in ("FilesList.txt") do (
    copy /B /Y "%%~F" C:\dst\ >nul
)
popd

Команда md также создает все дерево каталогов при создании каталога с включенными по умолчанию расширениями команд.

В обоих случаях каталог C:\dst после выполнения командного файла содержит:

  • gtsam.dll
  • msvcr120.dll
  • tbb.dll

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

Но предположим, что файлы должны быть скопированы с дублированием структуры каталогов из исходного каталога в целевой каталог, в результате чего после выполнения пакетного файла будет получен каталог C:\dst:

  • gtsam.dll
  • msvcr120.dll
  • intel64
    • vc12
      • tbb.dll

В этом случае пакетный код с xcopy может быть:

@echo off
setlocal EnableExtensions EnableDelayedExpansion
pushd "C:\prefix\bin"
if "%CD:~-1%" == "\" ( set "BasePath=%CD%" ) else ( set "BasePath=%CD%\" )

for /F "usebackq delims=" %%F in ("FilesList.txt") do (
    set "SourcePath=%%~dpF"
    set "RelativePath=!SourcePath:%BasePath%=!"
    %SystemRoot%\System32\xcopy.exe "%%~F" "C:\dst\!RelativePath!" /C /H /I /K /Q /R /Y >nul
)

popd
endlocal

И пакетный код, использующий копию, может быть:

@echo off
if not exist "C:\dst" (
    md "C:\dst"
    if errorlevel 1 (
        echo.
        echo Failed to create directory C:\dst
        echo.
        pause
        goto :EOF
    )
)

setlocal EnableDelayedExpansion
pushd "C:\prefix\bin"
if "%CD:~-1%" == "\" ( set "BasePath=%CD%" ) else ( set "BasePath=%CD%\" )

for /F "usebackq delims=" %%F in ("FilesList.txt") do (
    set "SourcePath=%%~dpF"
    set "RelativePath=!SourcePath:%BasePath%=!"
    md "C:\dst\!RelativePath!" 2>nul
    copy /B /Y "%%~F" "C:\dst\!RelativePath!" >nul
)

popd
endlocal

Чтобы понять используемые команды и то, как они работают, откройте окно командной строки, выполните следующие команды и внимательно прочитайте все страницы справки, отображаемые для каждой команды.

  • copy /?
  • echo /?
  • endlocal /?
  • if /?
  • for /?
  • goto /?
  • md /?
  • pause /?
  • popd /?
  • pushd /?
  • set /?
  • setlocal /?
  • xcopy /?
person Mofi    schedule 29.11.2015
comment
even creates the entire directory structure to this directory automatically if not already existing. это неверно. Когда вы создаете образец текстового файла со списком файлов и пакетом, как описано, тогда файлы копируются в корень каталогов назначения (создание создается, если оно не существует), но в структуру каталогов, если она не существует на пункт назначения) не создается автоматически. - person STORM; 24.07.2016
comment
@STORM Первый пакетный код создает каталог dst в корне диска C: автоматически, если он еще не существует, что я написал. Не совсем понятно, что OP хотел для файла intel64\vc12\tbb.dll. Следует ли копировать этот файл в C:\dst\tbb.dll, как я понял из вопроса, или в C:\dst\intel64\vc12\tbb.dll, как вы, очевидно, думаете. Я добавил примеры кода для второго варианта и добавил примеры вывода папки назначения для всех 4 кодов пакетов, которые OP должен был уже предоставить, чтобы прояснить, что действительно нужно. - person Mofi; 24.07.2016

Не испытано:

@echo off

set "basedir=c:\prefix\bin"
set "destination=c:\destination"

for /r "%basedir%" %%# in (*gtsam.dll *msvcr120.dll *tbb.dll) do (
  copy "%%~f#" "%destination%"
)
person npocmaka    schedule 29.11.2015