Пакет: Копировать, затем удалить файлы из списка; необходима обработка ошибок

Вопрос или проблема

Я просмотрел множество тем о пакетной обработке из списка, но ничего подходящего не нашел. У меня есть текстовый файл со списком файлов, включая пути. Мне нужно сначала скопировать эти файлы на внешний диск, а затем удалить оригинальные файлы с системного диска. Приведенный ниже пакетный файл работает, но есть одна проблема: мне нужно восстановить структуру папок при копировании файлов на внешний диск. Например, если интересующий файл – это C:\foo\foo.txt, я хочу, чтобы он скопировался в папку \foo на внешнем диске. Я думал, что параметры xcopy настроены для этого, но он просто копирует все в одну папку.

Далее, мне хотелось бы добавить обработку ошибок в пакетный файл на случай, если некоторые файлы отсутствуют.

Большое спасибо за любую помощь! Вот что у меня есть на данный момент…

@echo off
for /f "tokens=* delims=" %%a in ('type "D:\files.txt"') do xcopy /shrkvy "%%a" "D:\Reclamation"
echo Все файлы скопированы в папку восстановления.
@echo off
for /f "tokens=* delims=" %%a in ('type "D:\files.txt"') do del "%%a"
echo Все файлы удалены с устройства.
pause

Я думаю, что вам нужно что-то вроде этого. Если файл не удается скопировать, он записывается в errors.txt и не удаляется из источника. Успешно скопированные файлы удаляются из источника.

@echo off

set Source=D:\files.txt
set Destination=D:\Reclamation

SetLocal EnableDelayedExpansion

for /f "tokens=* delims=" %%a in ('type "%Source%"') do (
                                                         IF not exist "%Destination%%%~pa" md "%Destination%%%~pa"
                                                         xcopy /shrkvy "%%a" "%Destination%%%~pa"
                                                         IF NOT !ErrorLevel! EQU 0 (echo "%%a">>"Errors.txt") else (del /q "%%a")
                                                        )

Ответ или решение

Конечно! Вам нужно создать пакетный файл, который будет копировать файлы из списка с учетом создания структуры каталогов, а также эффективно обрабатывать ошибки. Ниже я представляю вам доработанную версию вашего пакетного файла с необходимыми дополнениями.

@echo off

:: Задаем переменные для источника и назначения
set Source=D:\files.txt
set Destination=D:\Reclamation

:: Включение отложенного расширения переменных
SetLocal EnableDelayedExpansion

:: Проходим по каждому файлу из списка
for /f "tokens=* delims=" %%a in ('type "%Source%"') do (
    :: Создаем директорию назначения, если она не существует
    IF not exist "%Destination%%%~pa" (
        md "%Destination%%%~pa"
    )

    :: Копируем файл с обработкой ошибок
    xcopy /shrkvy "%%a" "%Destination%%%~pa" >nul 2>&1
    IF ERRORLEVEL 1 (
        echo "%%a" >> "Errors.txt"
    ) else (
        del /q "%%a"
    )
)

echo Все файлы обработаны. Проверьте Errors.txt на наличие ошибок.
pause

Объяснение кода:

  1. Установка переменных: Source — это путь к вашему текстовому файлу со списком файлов, а Destination — это папка назначения на внешнем диске.

  2. Отложенное расширение: Включается отложенное расширение переменных, что позволяет использовать переменные, изменяемые в цикле.

  3. Цикл по файлам: Мы читаем каждую строку из файла files.txt, где каждая строка соответствует пути к исходному файлу.

  4. Создание директории: Проверяется наличие директории назначения. Если директория не существует, создается новая.

  5. Копирование с обработкой ошибок: xcopy копирует файл. Если происходит ошибка (например, файл не найден), то файл записывается в Errors.txt. В противном случае удаляется исходный файл.

  6. Сообщение о завершении: В конце выводится сообщение о завершении обработки файлов и просьба проверить файл ошибок.

Обработка ошибок:

  • Все ошибки во время копирования записываются в Errors.txt. Таким образом, вы можете проанализировать, какие файлы не были скопированы и почему.

Это решение должно полностью удовлетворять вашим требованиям по копированию и удалению файлов с ошибками. Если у вас остались вопросы или нужны уточнения, не стесняйтесь обращаться!

Оцените материал
Добавить комментарий

Капча загружается...