Пакетный файл для рекурсивного копирования каталогов

Есть ли способ рекурсивного копирования каталогов внутри файла.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
Другие вопросы по тегам