[英]How to copy several specified files from a source folder and its subfolders to a destination folder?
我有源文件夾: c:\\prefix\\bin
我想從源文件夾及其子文件夾復制一組指定的文件。
可以說我要復制:
bin
... gtsam.dll
... msvcr120.dll
... intel64\
... vc12\
... tbb.dll
為了更清楚地說明我要復制的內容:
.\gtsam.dll .\msvcr120.dll .\intel64\vc12\tbb.dll
源目錄中有許多文件,許多子目錄也不想復制。 而且我必須復制的所有指定文件都不共享通配符。 它們不是全部*.dll
復制到c:\\dst
如何以最優雅的方式做到這一點?
使用copy還是xcopy或robocopy ?
我建議首先創建一個簡單的文本文件,其中包含逐行復制的文件,並使用相對路徑進行復制。
例如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 /?
未經測試:
@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%"
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.