我有源文件夹:c:\prefix\bin
我希望从源文件夹及其子文件夹复制一组指定的文件。
让我说我想复制:
bin
... gtsam.dll
... msvcr120.dll
... intel64\
... vc12\
... tbb.dll为了更清楚地理解我想复制的东西:
.\gtsam.dll .\msvcr120.dll .\intel64\vc12\tbb.dll源目录中有许多文件,我不想复制许多子目录。并且我必须复制的所有指定文件都不能共享外卡。它们并不都是复制到*.dll中的c:\dst。
我怎么能用最优雅的方式做这件事呢?
使用复制,或x拷贝,或机器人复制
发布于 2015-11-29 13:17:57
我建议首先创建一个简单的文本文件,其中逐行包含要用相对路径复制的文件。
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是一个目录,如果不存在,甚至会自动为该目录创建整个目录结构。
或者使用此脚本,命令复制,并在复制文件之前确保目标目录存在。
@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 /?发布于 2015-11-29 13:10:17
未测试:
@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%"
)https://stackoverflow.com/questions/33982008
复制相似问题