Как создать пакетный файл, который рекурсивно удаляет все папки с именем `bin` или` obj`?


31

У меня есть необходимость удаления всех папок bin& objв папке на моем ПК. Итак, я думаю о пакетном файле, чтобы сделать это, но я не жалуюсь о пакетном файле в Windows. Пожалуйста помоги.

[Редактировать]

После обсуждения с пользователем DMA57361я пришел к текущему решению (хотя проблема все еще остается, см. Наши комментарии):

Создайте файл .bat и вставьте следующую команду:

start for /d /r . %%d in (bin,obj) do @if exist "%%d" rd /s/q "%%d"

ИЛИ

start for /d /r . %%d in (bin,obj) do @if exist "%%d" rd /s "%%d"

@ DMA57361: Когда я запускаю ваш скрипт, я получаю сообщение об ошибке ниже. Есть идеи?

альтернативный текст


@Nam - почему ты бежишь for \/d \/r ...- почему двойная косая черта вместо for /d /r ...? И запуск «полной» версии с /qв конце - как я заявляю - удаляет все без предупреждения, поэтому не возвращает никаких выходных данных (т. Е. Он не сообщает вам, когда он работает, только при наличии ошибки), вы уверены, что второй работать выше не работает правильно?
DMA57361

@ Нам этот прогон тоже не то же самое - на изображении, с которого начинается for / %d in и не запускается ваша команда for /d /r . %d in- вы должны использовать всю команду ниже, каждый бит имеет свою функцию и важен.
DMA57361

@Nam Opps, мои извинения, вы совершенно правы, он не печатает первые несколько ключей! Тем не менее, это не выдает эту ошибку и, кажется, работает правильно, для меня. Вы пытались просто запустить команду из командной строки, вместо того, чтобы пытаться запустить ее из командного файла?
DMA57361

Хм, как странно. Возможно, ваш Win7 делает что-то другое с пакетом по сравнению с моим WinXP, не знаю, что. Я смогу проверить Win7 дома этим вечером, иначе я боюсь, что застрял на данный момент ...
DMA57361 21.10.10

На самом деле попробуйте добавить префикс команды batch startи посмотреть, что произойдет. Не идеально, но мне интересно, может ли это помочь.
DMA57361

Ответы:


42

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

Попробуйте следующую команду, вы можете запустить ее изнутри cmd:

for /d /r . %d in (bin,obj) do @if exist "%d" rd /s/q "%d"

Если вам нужно изменить другие папки, просто добавьте новые элементы в (bin,obj)набор в середине команды.

Это удалит все совпадения без предупреждения и без использования корзины - так что, если вы хотите немного дополнительной безопасности, откажитесь /qот вызова до rdв конце, и система должна спрашивать вас перед каждым удалением.

for /d /r . %d in (bin,obj) do @if exist "%d" rd /s "%d"

Если вы собираетесь запускать команду изнутри пакетного файла , вам нужно будет заменить каждый экземпляр переменной %dс %%d, например , так:

for /d /r . %%d in (bin,obj) do @if exist "%%d" rd /s/q "%%d"
OR
for /d /r . %%d in (bin,obj) do @if exist "%%d" rd /s "%%d"

Согласно конверсии в комментариях к вопросу

Если команда отказывается запускаться в командном файле (здесь невозможно выполнить репликацию), попробуйте добавить к команде префикс start. Хотя это запустит процесс для одновременного запуска с командным файлом, что может вызвать другие проблемы, скорее всего, он будет работать правильно.

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


1
Знаете ли вы, как я могу игнорировать одну папку в этой корневой папке, где я запускаю эту команду?
Горан Обрадович

Работал отлично! Спасибо! +1
khr055


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.