Как рекурсивно удалить файлы и пропустить удаление, если подпапка содержит файлы .one? - PullRequest
0 голосов
/ 22 октября 2019

Моя цель - удалить файл с именем Открыть Notebook.onetoc2 во всех папках и подпапках на диске Z:, НО НЕ удаляйте этот файл из тех папок, которые содержат *.one файлы (фактически OneNoteфайлы).

Я искал решения в Интернете по этому вопросу, но не нашел этого и не знаю, как именно собрать одну такую ​​команду сам.

Я дошел до этого:

for /F "delims=" %a in ('dir /b /s "Open Notebook.onetoc2"') do @if exist %~da%~pa*.one echo del: "%~da%~paOpen Notebook.onetoc2" 

Кажется, 99% выполнено, но застрял в ситуации, когда «если существует * .one» также включает файлы .onetoc2 в «поиск», что нежелательно. Я бы хотел, чтобы команда «search» только находила файлы .one, но не .onetoc2, поскольку важно пропустить удаление файла .onetoc2, если в этом каталоге есть файлы .one.

Спасибо заранее! :)

1 Ответ

1 голос
/ 22 октября 2019

Мое прокомментированное предложение в качестве ответа для запуска из командной строки :

For /F "Delims=" %A In ('Dir /B/S/A-D-S-L "Z:\Open Notebook.onetoc2" 2^>NUL')Do @If Not Exist "%~dpA*.one" Del /A/F "%A"

Основано на синтаксисе For /F: For /F ["options"] %variable In ('command')Do command [command-parameters] Сначала нам нужно взятьпосмотрите на 'command'. Мы хотим вывести все файлы с корнем в Z:\ с именем Open Notebook.onetoc2, мы делаем это, используя Dir, (введите dir /? для его использования) . В целях безопасности я исключил из этого вывода все системные файлы или точки повторной обработки и перенаправил любое сообщение об ошибке на устройство NUL, которое предотвращает передачу любого сообщения, если оно не существует, на Do.

Цикл For передает каждый файл как полный путь к Do как метавариабельный %A. Сначала мы хотим убедиться, что наряду с любым возвращенным файлом другой файл с расширением .one не существует. Для этого мы используем условие If Not Exist, (синтаксис см. if /?) . %A может быть расширен только на его диск и путь, (т.е. родительский каталог любого возвращенного Open Notebook.onetoc2 файла) , используя %~dpA, (этот синтаксис доступен в For справочная информация о команде, for /?) .

Если условие выполнено, мы удаляем файл с помощью команды Del. Поскольку файлы могут быть доступны только для чтения, мы используем опции /A и /F, (синтаксис см. del /?) .


Если вы хотите сделать то же самое, но из , это будет выглядеть примерно так:
@For /F "Delims=" %%A In ('Dir /B/S/A-D-S-L "Z:\Open Notebook.onetoc2" 2^>NUL')Do @If Not Exist "%%~dpA*.one" Del /A/F "%%A"
...