3

У меня есть два диска, скажем, диск A (F:) и диск B (G:). Однажды я скопировал все содержимое диска B на диск A. Но после этого на дискB добавлены новые файлы и папки. Я хотел бы удалить дубликаты файлов и папок с диска B и оставить только те, которые не существуют на диске A.

Я попробовал приведенную ниже команду просто для того, чтобы проверить, найдены ли дубликаты, но она не работает так, как я хотел, потому что у нее полный путь в переменной %%a . Конечно, вывод, который теперь имеет echo %%a будет заменен эквивалентом DEL если он работает.

@echo off
for /F "tokens=*" %%a in ('dir G:\*.* /b /s') do if not exist "F:\%%a" echo %%a >> C:\Users\billy\Desktop\files.txt
pause

Если я удаляю ключ /s из команды dir он работает, потому что %%a имеет только имя файла вместо полного пути, но он не работает рекурсивно для подпапок, поэтому он не так полезен.

1 ответ1

1
@echo off
for /F "delims=" %%a in ('
  dir G:\*.* /b /s /A:-D
  ') do if not exist "F:%%~pnxa" echo del "%%~a" >> C:\Users\billy\Desktop\files.txt
pause

Объяснение:

  • /A:-D чтобы исключить каталоги (папки) из списка, поскольку последующая команда del удалит файлы вместо каталога (согласно del /? Если указан каталог, будут удалены все файлы в каталоге, кроме самой папки). не будут удалены);
  • обрабатывать папки отдельно: используйте другую for /F против dir с ключом /A:D но в этом случае используйте rd вместо команды del для удаления папки ; используйте rd /S для удаления всего дерева папок (все файлы и подпапки в дополнение к самой папке).
  • %%~pnxa расширяет %%a до полного пути + имя + расширение, включая ведущий \ (без G: спецификация диска);
  • del "%%~a" полный путь в двойных кавычках для правильной обработки путей с пробелами;
  • Я рекомендую "delims=" вместо "tokens=*" чтобы правильно обрабатывать возможные начальные пробелы в именах файлов (это может иметь место с флагом no /S);
  • рассмотреть дополнительные ключи командной строки (см. del /? и rd /?).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .