Я предлагаю сначала создать простой текстовый файл, содержащий построчно файлы для копирования с относительным путем.
Пример для 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
В этом случае пакетный код с 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