首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将多个指定文件从源文件夹及其子文件夹复制到目标文件夹?

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

Stack Overflow用户
提问于 2015-11-29 10:58:34
回答 2查看 387关注 0票数 0

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

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

让我说我想复制:

代码语言:javascript
复制
bin
... gtsam.dll
... msvcr120.dll
... intel64\
    ... vc12\
        ... tbb.dll

为了更清楚地理解我想复制的东西:

代码语言:javascript
复制
.\gtsam.dll .\msvcr120.dll .\intel64\vc12\tbb.dll

源目录中有许多文件,我不想复制许多子目录。并且我必须复制的所有指定文件都不能共享外卡。它们并不都是复制到*.dll中的c:\dst

我怎么能用最优雅的方式做这件事呢?

使用复制,或x拷贝,或机器人复制

EN

回答 2

Stack Overflow用户

发布于 2015-11-29 13:17:57

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

FilesList.txt示例

代码语言:javascript
复制
gtsam.dll
msvcr120.dll
intel64\vc12\tbb.dll

这取决于您要在哪个目录中存储此列表文件的名称,以便复制。

下面的代码期望这个文件位于C:\prefix\bin目录中。

然后使用以下代码创建一个批处理文件:

代码语言:javascript
复制
@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是一个目录,如果不存在,甚至会自动为该目录创建整个目录结构。

或者使用此脚本,命令复制,并在复制文件之前确保目标目录存在。

代码语言:javascript
复制
@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的批处理代码可以是:

代码语言:javascript
复制
@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

使用复制的批处理代码可以是:

代码语言:javascript
复制
@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 /?
票数 3
EN

Stack Overflow用户

发布于 2015-11-29 13:10:17

未测试:

代码语言:javascript
复制
@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%"
)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33982008

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档