Пакетный файл для рекурсивного копирования каталогов
Есть ли способ рекурсивного копирования каталогов внутри файла.bat? Если это так, пример будет отличным. Благодарю.
5 ответов
Посмотрите на xcopy, который будет рекурсивно копировать файлы и подкаталоги.
Есть примеры, 2/3 вниз по странице. Особое использование это:
Чтобы скопировать все файлы и подкаталоги (включая любые пустые подкаталоги) с диска A на диск B, введите:
xcopy a: b: /s /e
Прочитав комментарии к принятому ответу, я попробовал команду robocopy, которая работала для меня (используя стандартную командную строку из Windows 7 64 бит SP 1):
robocopy source_dir dest_dir /s /e
Я хотел воспроизвести Unix/Linux
cp -r
как можно точнее. Я придумал следующее:
xcopy /e /k /h /i srcdir destdir
Описание флага:
/e
Копирует каталоги и подкаталоги, в том числе пустые./k
Копирует атрибуты. Обычный Xcopy сбросит атрибуты только для чтения./h
Копирует также скрытые и системные файлы./i
Если место назначения не существует и копируется более одного файла, предположим, что местом назначения является каталог.
Я сделал следующее в командном файле (cpr.bat
), чтобы мне не пришлось запоминать флаги:
xcopy /e /k /h /i %*
Использование: cpr srcdir destdir
Вы также можете использовать следующие флаги, но я этого не сделал:/q
Тихий. Не отображать имена файлов во время копирования./b
Копирует саму символическую ссылку вместо цели ссылки. (требуется администратор UAC)/o
Копирует списки управления доступом к каталогам и файлам. (требуется администратор UAC)
Вы можете написать рекурсивный алгоритм в Batch, который дает вам точный контроль над тем, что вы делаете в каждом вложенном подкаталоге:
@echo off
call :treeProcess
goto :eof
:treeProcess
rem Do whatever you want here over the files of this subdir, for example:
copy *.* C:\dest\dir
for /D %%d in (*) do (
cd %%d
call :treeProcess
cd ..
)
exit /b
Windows Batch File Looping по каталогам для обработки файлов?
Чистый пакетный фрагмент *.bat для рекурсивной папки с копированием файлов. Без xcopy/robocopy и других внешних инструментов.
Это цикл по каталогам, объединение пути назначения с относительным исходным путем и копирование папок. Относительный путь получается из абсолютного пути без исходной части (обрезанного по длине исходного пути).
Установить путь к исходному каталогу для исходного каталога. Установить
путь к исходному каталогу для целевого каталога
(1) rmdir /s /q %destdircopy% удалит все файлы в целевой папке.
Например, этот код удалит каталог « build\src » и скопирует все папки с файлами из « src\ » в « build\src » .
@ECHO OFF
SET "sourcedir=src"
SET "destdir=build"
SET "destdircopy=%destdir%\%sourcedir%"
@REM (1) ------------------------------------------------------- CLEAR BEFORE COPY
rmdir /s /q %destdircopy%
@REM (2) ------------------------------------------------------- GET SOURCE PATH LENGTH
Setlocal EnableDelayedExpansion
set "files=0"
pushd %sourcedir%
set ABS_PATH=%CD%
popd
echo "%sourcedir% absolute path is %ABS_PATH%"
call :length srclen "%ABS_PATH%"
@REM (3) ------------------------------------------------------- FOR SUBDIRECTORIES LOOP
for /f "tokens=*" %%G in ('dir /b /s /a:d "%sourcedir%"') do (
set /a files += 1
call :length len "%%~fG"
setlocal enabledelayedexpansion
SET _path=%%~fG
SET _startchar=%srclen%
SET /A _length=!len!-%srclen%
CALL SET _substring=%%_path:~!_startchar!,!_length!%%
set currentpath=%%G
MKDIR %destdircopy%!_substring!
copy !currentpath! %destdircopy%!_substring!
)
copy %sourcedir% %destdircopy%
goto :EOF
@REM (4) ------------------------------------------------------- PATH STRING LENGTH
:length <return_var> <string>
setlocal enabledelayedexpansion
if "%~2"=="" (set ret=0) else set ret=1
set "tmpstr=%~2"
for %%I in (4096 2048 1024 512 256 128 64 32 16 8 4 2 1) do (
if not "!tmpstr:~%%I,1!"=="" (
set /a ret += %%I
set "tmpstr=!tmpstr:~%%I!"
)
)
endlocal & set "%~1=%ret%"
goto :EOF
@REM (5) www.ildar.in/code/snippets/batch_folder_copy_recurcive.bat