BATCH для удаления и копирования (резервного копирования) определенных папок и подпапок

У меня два диска, I: — мой основной диск, а J: — резервный диск для I:.

Мой пакет ниже начинается с удаления всего внутри диска J:, кроме следующих папок: «Папка 1», «Папка 2», «Информация о системном томе», «$ Recycle.bin». Затем мой пакет копирует диск I: (кроме «Папка 1», «Папка 2», «Информация о системном томе», «$ Recycle.bin») и вставляет все внутри J:. Это работает как шарм (кредиты и спасибо @user1016274):

@Echo Off
md J:\empty
%SystemRoot%\System32\robocopy.exe /MIR J:\empty J:\ /XD "Folder One" "Folder Two" "System Volume Information" $Recycle.bin
%SystemRoot%\System32\robocopy.exe I:\ J:\ *.* /MIR /XD "Folder One" "Folder Two" "System Volume Information" $Recycle.bin /copy:DAT /dcopy:DA /r:0 /v /xj /mt:32

Пожалуйста, мне нужно улучшить мою партию с помощью последних двух шагов:

  1. Вместо «Папка 1» как я могу использовать путь с подпапкой, такой как «Папка 1/Папка 1 вложенная папка»?

  2. Как я могу заменить свой

%SystemRoot%\System32\robocopy.exe I:\ J:\ *.* /MIR /XD "Folder One" "Folder Two" "System Volume Information" $Recycle.bin /copy:DAT /dcopy:DA /r:0 /v /xj /mt:32

с командной строкой, которая:

а) Он скопирует все внутри I:, но вставит в J: только те файлы, которые есть в I:, но которых нет в J:.

б) Он скопирует файлы из I:, вставит в J:, даже если файлы уже существуют (файлы с таким же именем в I: и J:), но заменит файлы в J:, только если что-то (размер, дата, что угодно) измененный.

Общая идея состоит в том, чтобы скопировать все внутри I: и вставить внутрь J:, но только если файлы не находятся в J:, и только если файлы существуют в J:, но отличаются от файлов в I:.

Надеюсь, вы можете мне помочь! Это мои последние два шага, которые мне нужны, чтобы закончить мои партии. Заранее большое спасибо!

@Mofi: опубликуйте свой комментарий в качестве ответа, чтобы этот вопрос можно было закрыть как решенный. Приятное наблюдение, что опция зеркала /MIR удалит файлы в целевой папке, которых нет/больше нет в исходной папке. Таким образом, не нужно явно удалять всю папку назначения.

user1016274 17.06.2023 21:53

@Lepefe, не забудьте добавить параметры, которые вы уже выбрали в свой код, чтобы сохранить временные метки скопированных файлов и папок /copy:DAT /dcopy:DA, которые Мофи пропустил.

user1016274 17.06.2023 21:56
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
53
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Сначала следует открыть командную строку, запустить robocopy /? и внимательно прочитать справку по использованию вывода сверху вниз.

Также доступна следующая документация для команды Windows ROBOCOPY, которая является исполняемым файлом в каталоге Windows System32, доступным по умолчанию, начиная с Windows Vista и Windows Server 2003.

  • Документация Microsoft для ROBOCOPY
  • Документация SS64 для ROBOCOPY.exe с дополнительной документацией по кодам выхода ROBOCOPY

Исполняемый файл недоступен по умолчанию в Windows XP и предыдущих версиях Windows. %SystemRoot%\System32\Robocopy.exe можно скопировать с Windows Server 2003 (реальная машина или ISO-образ Windows Server 2003) в каталог %SystemRoot%\System32 машины под управлением Windows XP SP3, чтобы он также был доступен на машине с Windows XP.

В командном файле требуется только одна командная строка:

@%SystemRoot%\System32\Robocopy.exe I:\ J:\ /DCOPY:T /MIR /MT:32 /NDL /NFL /NJH /NJS /R:0 /XJ /XD "I:\Folder One\Folder One Sub Folder" "I:\Folder Two" "I:\System Volume Information" I:\$Recycle.bin

Шаблон подстановочного знака *.* интерпретируется функциями ввода-вывода файла окна, например *, что означает, что любой файл / каталог является значением по умолчанию и поэтому не должен быть явно указан в командной строке.

Опция /COPY:DAT опущена, так как она используется по умолчанию.

Для каталогов по умолчанию копируются также атрибуты (архивный, скрытый, только для чтения, системный), но не отметка времени последнего изменения. Опция /DCOPY:T приводит к установке метки времени последней модификации исходного каталога также в каталоге назначения.

Это зависит от файловой системы исходного и целевого диска, если /COPY: и /DCOPY: с дополнительными атрибутами, такими как информация о безопасности, владельце или аудите, имеют смысл или нет. Если один из дисков не отформатирован в NTFS, например, при использовании FAT32 или exFAT для резервного диска, специальные атрибуты NTFS вообще не могут быть скопированы. Если оба диска отформатированы в NTFS, может иметь смысл скопировать также специальные атрибуты NTFS, чтобы получить 100% резервную копию, но это также может быть немного проблематично, если резервный диск используется позже на другой машине.

Опция зеркала /MIR вызывает удаление всех файлов и папок в целевом каталоге J:\ (корневой каталог диска J:), которые не существуют в исходном каталоге I:\ (корневой каталог диска I:), за исключением тех каталогов, которые исключены в исходном каталоге. как указано после опции исключения каталога /XD.

По этой причине на обоих дисках (в их корневых каталогах) игнорируются:

  1. Folder One\Folder One Sub Folder
  2. Folder Two
  3. System Volume Information
  4. $Recycle.bin

По этой причине отдельный процесс удаления каталога перед началом процесса копирования/резервного копирования не требуется.

Параметр /MIR по умолчанию включает также параметры /E и /S для копирования всех подкаталогов, включая пустые подкаталоги и все файлы в подкаталогах.

Это зависит от следующих критериев, имеет ли смысл вариант /MT:32 для использования до 32 потоков копирования:

  • количество ядер процессора вообще;
  • количество других процессов, запущенных во время операции копирования;
  • тип носителя (носителей) исходного и целевого дисков.
  • Диск J: находится на другом носителе, чем диск I:, или на том же физическом устройстве?

Например, если диски I: и J: являются разделами на одном жестком диске с одной или несколькими жесткими быстровращающимися пластинами, использование более одного потока копирования непродуктивно, поскольку все обращения к диску (чтение в источнике и запись в месте назначения) должны быть сериализованы. при доступе к жесткому диску, на котором рычаг привода с магнитными головками должен перемещаться по пластинам.

Также лучше использовать меньше потоков копирования на машине, которая в дальнейшем используется одним или несколькими пользователями с несколькими запущенными процессами, в то время как задача копирования выполняется ROBOCOPY.

Параметры /NDL /NFL /NJH /NJS отключают вывод консоли во время и после процесса копирования, что ускоряет процесс копирования.

Параметр /R:0 устанавливает количество попыток равным 0. Это имеет смысл на обоих дисках, которые являются локальными. Следует использовать большее значение с соответствующей опцией /W:, также указанной в командной строке, если доступ к одному из двух дисков осуществляется через сеть, так как также может возникнуть временная проблема доступа к сети во время копирования данных, на которых повторяются попытки с задержкой в ​​​​несколько секунд. между каждой повторной попыткой имеет смысл.

Опция /XJ исключает следующие соединения (ссылки), которые могут даже ссылаться на каталоги на другом диске, отличном от исходного диска I:. Не следует копировать каталоги и файлы с других дисков, кроме исходного диска I:. См. документацию SS64 для MKLink, объясняющую типы ссылок.


Для этой задачи вообще не нужен пакетный файл, если пакетный файл не содержит других команд. Для этой задачи следует использовать файл ярлыка.

Файл ярлыка может быть создан с помощью

  1. просмотр каталога %SystemRoot%\System32, который обычно находится C:\Windows\System32 в проводнике Windows,
  2. щелчок вторичной (обычно правой) кнопкой указывающего устройства (мыши) на файле Robocopy.exe,
  3. щелчок основной (левой) кнопкой указывающего устройства (мыши) в открытом контекстном меню в пункте меню Показать дополнительные параметры внизу, чтобы вообще отображаться в контекстном меню, как в Windows 11,
  4. нажав на пункт меню Отправить для открытия этого подменю,
  5. нажав на Рабочий стол (создать ярлык).

Теперь на рабочем столе пользователя находится файл ярлыка Robocopy.exe - Shortcut с не отображаемым расширением файла .lnk. Это имя не подходит, и поэтому лучше сначала переименовать ярлык, щелкнув кнопку вторичного указывающего устройства на ярлыке и нажав кнопку «Далее» в элементе контекстного меню. Показать дополнительные параметры, если он еще не отображается. переименовав файл ярлыка, например, в Backup I to J. Невидимое расширение файла .lnk не изменяется этой операцией переименования.

Переименованный файл ярлыка необходимо щелкнуть еще раз с помощью кнопки вторичного указывающего устройства, чтобы открыть контекстное меню, в котором необходимо щелкнуть еще раз. Показать дополнительные параметры, если это необходимо, чтобы отобразить внизу пункт меню «Свойства», который необходимо щелкнуть для открытие окна свойств ярлыка.

Свойство Target уже содержит ROBOCOPY с полным именем файла. Это свойство необходимо расширить, добавив остальную часть командной строки. Символ @ предназначен только для cmd.exe обработки в пакетном файле. Свойство Target ярлыка должно быть без этого символа в начале.

Другими словами, свойство Target равно

%SystemRoot%\System32\Robocopy.exe I:\ J:\ /DCOPY:T /MIR /MT:32 /NDL /NFL /NJH /NJS /R:0 /XJ /XD "I:\Folder One\Folder One Sub Folder" "I:\Folder Two" "I:\System Volume Information" I:\$Recycle.bin

что позволяет использовать файл ярлыка также на другом компьютере, на котором установлена ​​Windows на диске D: вместо диска C: или

C:\Windows\System32\Robocopy.exe I:\ J:\ /DCOPY:T /MIR /MT:32 /NDL /NFL /NJH /NJS /R:0 /XJ /XD "I:\Folder One\Folder One Sub Folder" "I:\Folder Two" "I:\System Volume Information" I:\$Recycle.bin

который выполняется на несколько наносекунд быстрее из-за отсутствия ссылки на переменную среды %SystemRoot%, которая должна быть сначала расширена на explorer.exe.

Старт можно оставить как есть. Он определяет текущий рабочий каталог для Robocopy.exe.

Другие свойства на вкладке «Ярлык» и другие вкладки можно настроить по желанию, прежде чем, наконец, нажать кнопку «ОК», чтобы применить изменения и закрыть окно.

Использование ярлыка лучше, чем использование пакетного файла из-за всех параметров, которые можно настроить в свойствах ярлыка, которые explorer.exe при двойном щелчке по файлу ярлыка передаются функции библиотеки ядра Windows CreateProcess с соответствующим заполненным вышла STARTUPINFO структура.

Двойной щелчок командного файла приводит к explorer.exe вызову также CreateProcess запуска %ComSpec% /c "C:\Path\To\Batch File.cmd" с настройками, хранящимися в реестре под ключом HKEY_CURRENT_USER\Console.

Таким образом, разница между ярлыком и пакетным файлом заключается в том, что с помощью файла ярлыка запускается только один процесс вместо двух, и у пользователя есть возможность с файлом ярлыка определить красивый значок для этого ярлыка, как из файла %SystemRoot%\System32\shell32.dll, определить хороший показанный комментарий в качестве всплывающей подсказки при наведении указателя мыши на ярлык, определить способ открытия окна консоли (обычное или свернутое), определить размер окна консоли, цвет текста и цвет фона в окне консоли и т. д.

Файл ярлыка также можно вырезать с рабочего стола и вставить в меню «Пуск» Windows или подпапку меню «Пуск» Windows (каталог %APPDATA%\Microsoft\Windows\Start Menu только для текущего пользователя или каталог %ALLUSERSPROFILE%\Microsoft\Windows\Start Menu для всех пользователей) или любую другую папку или прикрепить к панели задач Windows.

Также можно назначить горячую клавишу для запуска ROBOCOPY, нажав эту горячую клавишу, независимо от того, какое приложение в данный момент имеет фокус ввода.

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

Миллионы благодарностей @Mofi! Удивительный ответ и объяснение. Пожалуйста, только один вопрос по ярлыку: В "Target" у меня "C:\Windows\System32\Robocopy.exe". Сохраню ли я его и добавлю ли ваш код после него? (C:\Windows\System32\Robocopy.exe %SystemRoot%\System32\Robocopy.exe I:\ J:\ /DCOPY:T и т. д.) Или я должен заменить все в «Target» на %SystemRoot%\System32\Robocopy. exe I:\J:/DCOPY:T и т. д.? Еще раз спасибо!

Lepefe 18.06.2023 12:49

Мой последний комментарий адресован вам, @Mofi, еще раз, чтобы поблагодарить вас за такой красивый код и потрясающий ответ с объяснением. Вы помогаете людям, но у вас также хватает терпения понимать, что не каждый пользователь имеет одинаковый уровень знаний, и не у каждого пользователя есть время читать тонны материала (иногда нам просто нужен код). СПАСИБО! PS: Еще одним преимуществом ярлыка является то, что он может выполняться автоматически с правами администратора.

Lepefe 18.06.2023 13:10

Другие вопросы по теме

Похожие вопросы

Как извлечь встроенную ссылку из сохраненного в виде текста html-документа ИЛИ как использовать xidel для извлечения правильной ссылки?
Процент входа в файл .bat не работает с командой powershell
Как запустить исполняемый файл с графическим интерфейсом и консольную программу и завершить консольное приложение в приложении с графическим интерфейсом, закрытом пользователем?
Как создать файл журнала приглашения Windows при запуске файла bat
Каков более эффективный способ удаления дубликатов из CSV-файла на основе определенных полей с помощью пакетного сценария (и, если необходимо, gawk)?
Как я могу объединить два текстовых файла, но добавить только недостающие строки из первого файла в пакетном файле Windows?
Как я могу изменить пакет непрерывной проверки связи для ежедневной записи в новый файл в качестве запланированной задачи?
Выходные данные запроса WMIC имеют дополнительные пробелы при копировании в файл CSV из выполнения пакетного файла
Как я могу подсчитать количество токенов, сгенерированных циклом for/f?
Получите часть имени файла с файлом Windows bat и объедините несколько PDF-файлов с помощью GhostScript