【问题标题】:How to copy several specified files from a source folder and its subfolders to a destination folder?如何将多个指定文件从源文件夹及其子文件夹复制到目标文件夹?
【发布时间】:2016-03-03 02:37:29
【问题描述】:

我有源文件夹:c:\prefix\bin

我想从源文件夹及其子文件夹中复制一组指定的文件。

假设我想复制:

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

为了更清楚我想要复制的内容:

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

源目录中有很多文件,还有很多我不想复制的子目录。而且我必须复制的所有指定文件都不共享通配符。不都是*.dll复制到c:\dst

我怎样才能用最优雅的方式做到这一点?

使用 copyxcopyrobocopy

【问题讨论】:

    标签: windows batch-file cmd copy robocopy


    【解决方案1】:

    我建议首先创建一个简单的文本文件,其中包含要使用相对路径复制的文件。

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

    使用 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 /?

    【讨论】:

    • even creates the entire directory structure to this directory automatically if not already existing. 这是不正确的。当您使用描述的文件列表和批处理创建示例文本文件时,文件将被复制到目标目录根目录(如果目标不存在,则正在创建目标),但目录结构(如果不存在)目的地)不会自动创建。
    • @STORM 第一个批处理代码在驱动器 C 的根目录中创建目录 dst:如果我写的内容不存在,则自动创建该目录。目前还不清楚 OP 对文件 intel64\vc12\tbb.dll 的要求是什么。应该将此文件复制到C:\dst\tbb.dll,正如我从问题中理解的那样,还是复制到C:\dst\intel64\vc12\tbb.dll,正如您显然认为的那样。我为第二个变体添加了代码示例,并为所有 4 个批处理代码添加了目标文件夹输出示例,OP 应该已经给出了这些代码,以明确真正想要的是什么。
    【解决方案2】:

    未测试:

    @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%"
    )
    

    【讨论】:

      猜你喜欢
      • 2017-03-31
      • 2015-02-08
      • 1970-01-01
      • 1970-01-01
      • 2021-06-07
      • 2021-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多