我建议首先创建一个简单的文本文件,其中包含要使用相对路径复制的文件。
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是一个目录,甚至为此创建整个目录结构如果目录不存在,则自动生成。
或者您使用此脚本和命令 copy 并在复制文件之前确保目标目录存在。
@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
使用 copy 的批处理代码可以是:
@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 /?