如何将源文件夹及其子文件夹中的多个指定文件复制到目标文件夹?

时间:2015-11-29 10:58:34

标签: windows batch-file cmd copy robocopy

我有源文件夹: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

2 个答案:

答案 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包含批处理文件执行后:

  • 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 /?

答案 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%"
)