我有源文件夹:c:\prefix\bin
我想从源文件夹及其子文件夹中复制一组指定的文件。
让我们说要复制:
bin
... gtsam.dll
... msvcr120.dll
... intel64\
... vc12\
... tbb.dll
更清楚地表达我要复制的内容:
.\gtsam.dll .\msvcr120.dll .\intel64\vc12\tbb.dll
源目录中有许多文件以及我不想复制的许多子目录。我要复制的所有指定文件都不共享通配符。它们并非都是*.dll
要复制到c:\dst
我怎样才能以最优雅的方式做到这一点?
使用复制, xcopy 或 robocopy ?
答案 0 :(得分:3)
我建议首先创建一个简单的文本文件,逐行包含要用相对路径复制的文件。
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
如果在此处使用反斜杠指定了target,并且使用了选项/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
包含批处理文件执行后:
使用包含要使用相对路径复制的文件名称的列表文件的主要优点是将来可以轻松更新,而无需更改批处理代码。
但是,假设应该复制文件,并将目录结构从源目录复制到目标目录,从而导致目录C:\dst
包含批处理文件后执行:
在这种情况下, 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 /?
答案 1 :(得分:1)
未经测试:
@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%"
)