Найти в Дзене
Блог IT разработчика

Копирование папки средствами batch

BAT‑файл с механизмом отката (восстановления исходной папки) в случае ошибки при копировании: bat @echo off setlocal :: Настройки set "SOURCE_DIR=C:\путь\к\исходной\директории" set "DEST_DIR=C:\путь\к\целевой\директории" set "LOG_FILE=C:\путь\к\логу\copy_log.txt" set "BACKUP_DIR=%TEMP%\copy_backup_%DATE:/=_%_%TIME::=_%\" :: Очищаем временные переменные set ERROR_OCCURRED=0 :: Создаём лог‑файл с отметкой времени echo [%DATE% %TIME%] Начало копирования >> "%LOG_FILE%" :: Проверяем существование исходной директории if not exist "%SOURCE_DIR%\" ( echo [%DATE% %TIME%] ОШИБКА: Исходная директория не найдена: "%SOURCE_DIR%" >> "%LOG_FILE%" echo Ошибка: исходная директория не найдена. exit /b 1 ) :: Создаём резервную копию исходной директории перед копированием echo [%DATE% %TIME%] Создаю резервную копию "%SOURCE_DIR%" в "%BACKUP_DIR%" >> "%LOG_FILE%" xcopy /E /H /K /Y /C "%SOURCE_DIR%\*" "%BACKUP_DIR%\" >> "%LOG_FILE%" 2>&1 if errorlevel 1 ( echo [%DATE% %TIME%] ОШИБКА: Не уда
Оглавление

BAT‑файл с механизмом отката (восстановления исходной папки) в случае ошибки при копировании:

bat

@echo off

setlocal

:: Настройки

set "SOURCE_DIR=C:\путь\к\исходной\директории"

set "DEST_DIR=C:\путь\к\целевой\директории"

set "LOG_FILE=C:\путь\к\логу\copy_log.txt"

set "BACKUP_DIR=%TEMP%\copy_backup_%DATE:/=_%_%TIME::=_%\"

:: Очищаем временные переменные

set ERROR_OCCURRED=0

:: Создаём лог‑файл с отметкой времени

echo [%DATE% %TIME%] Начало копирования >> "%LOG_FILE%"

:: Проверяем существование исходной директории

if not exist "%SOURCE_DIR%\" (

echo [%DATE% %TIME%] ОШИБКА: Исходная директория не найдена: "%SOURCE_DIR%" >> "%LOG_FILE%"

echo Ошибка: исходная директория не найдена.

exit /b 1

)

:: Создаём резервную копию исходной директории перед копированием

echo [%DATE% %TIME%] Создаю резервную копию "%SOURCE_DIR%" в "%BACKUP_DIR%" >> "%LOG_FILE%"

xcopy /E /H /K /Y /C "%SOURCE_DIR%\*" "%BACKUP_DIR%\" >> "%LOG_FILE%" 2>&1

if errorlevel 1 (

echo [%DATE% %TIME%] ОШИБКА: Не удалось создать резервную копию. Копирование прервано. >> "%LOG_FILE%"

echo Ошибка: не удалось создать резервную копию.

exit /b 1

)

:: Проверяем/создаём целевую директорию

if not exist "%DEST_DIR%\" (

echo [%DATE% %TIME%] Целевая директория не найдена. Создаю: "%DEST_DIR%" >> "%LOG_FILE%"

mkdir "%DEST_DIR%"

if errorlevel 1 (

echo [%DATE% %TIME%] ОШИБКА: Не удалось создать директорию: "%DEST_DIR%" >> "%LOG_FILE%"

echo Ошибка: не удалось создать целевую директорию.

goto RESTORE

)

)

:: Копируем файлы

echo [%DATE% %TIME%] Начинаю копирование из "%SOURCE_DIR%" в "%DEST_DIR%" >> "%LOG_FILE%"

xcopy /E /H /K /Y /C "%SOURCE_DIR%\*" "%DEST_DIR%\" >> "%LOG_FILE%" 2>&1

:: Проверяем результат копирования

if errorlevel 1 (

set ERROR_OCCURRED=1

echo [%DATE% %TIME%] ОШИБКА: Копирование завершилось с ошибкой. >> "%LOG_FILE%"

) else (

echo [%DATE% %TIME%] КОПИРОВАНИЕ УСПЕШНО завершено. >> "%LOG_FILE%"

)

:: Если была ошибка — восстанавливаем из резервной копии

if "%ERROR_OCCURRED%"=="1" (

goto RESTORE

) else (

echo Копирование успешно завершено. Лог: "%LOG_FILE%".

rmdir /S /Q "%BACKUP_DIR%" 2>nul :: Удаляем резервную копию

exit /b 0

)

:RESTORE

echo [%DATE% %TIME%] НАЧАЛО ВОССТАНОВЛЕНИЯ из резервной копии >> "%LOG_FILE%"

echo [%DATE% %TIME%] Восстанавливаю "%SOURCE_DIR%" из "%BACKUP_DIR%" >> "%LOG_FILE%"

:: Очищаем исходную директорию перед восстановлением

rmdir /S /Q "%SOURCE_DIR%" 2>nul

if exist "%SOURCE_DIR%\" (

echo [%DATE% %TIME%] ОШИБКА: Не удалось очистить исходную директорию для восстановления. >> "%LOG_FILE%"

echo Ошибка: не удалось восстановить исходную директорию.

exit /b 1

)

:: Восстанавливаем из резервной копии

xcopy /E /H /K /Y /C "%BACKUP_DIR%\*" "%SOURCE_DIR%\" >> "%LOG_FILE%" 2>&1

if errorlevel 1 (

echo [%DATE% %TIME%] ОШИБКА: Восстановление из резервной копии не удалось. >> "%LOG_FILE%"

echo Критическая ошибка: не удалось восстановить исходные данные!

exit /b 1

) else (

echo [%DATE% %TIME%] ВОССТАНОВЛЕНИЕ УСПЕШНО завершено. >> "%LOG_FILE%"

echo Ошибка при копировании. Данные восстановлены из резервной копии.

)

:: Удаляем резервную копию после восстановления

rmdir /S /Q "%BACKUP_DIR%" 2>nul

exit /b 1

endlocal

Как работает механизм отката

  1. Создание резервной копии
  2. Перед копированием скрипт создаёт полную копию исходной директории во временной папке (%TEMP%).
  3. Попытка копирования
  4. Если копирование завершается с ошибкой (errorlevel 1), скрипт переходит к метке :RESTORE.
  5. Восстановление
  • Удаляет содержимое исходной директории (если возможно).
  • Восстанавливает данные из резервной копии.
  • Очищает временную резервную копию.
  1. Очистка
  2. Если копирование прошло успешно, резервная копия удаляется.

Важные замечания

  • Временная папка: Резервная копия хранится в %TEMP%, что гарантирует её удаление после перезагрузки (если скрипт не смог очистить её сам).
  • Права доступа: Для восстановления требуются права на запись в исходную директорию.
  • Скорость: Создание резервной копии замедляет процесс — используйте для критических данных.
  • Место на диске: Убедитесь, что в %TEMP% достаточно свободного места для копии.

Настройка

Измените пути в строках:

  • SOURCE_DIR — исходная директория;
  • DEST_DIR — целевая директория;
  • LOG_FILE — файл лога.