Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Бесконечный цикл, если в имени папки есть знак процента

Ответить
Настройки темы
CMD/BAT - [решено] Бесконечный цикл, если в имени папки есть знак процента

Новый участник


Сообщения: 3
Благодарности: 0

Профиль | Отправить PM | Цитировать


Прошу помочь.
Есть такой код батника:

@echo off
cls
goto :2
:3
for /d %%I in ("%~1\*") do (call :3 "%%~I" & rd /q "%%~I" & cls & echo "%%~I")
exit /b
:2
call :3 "D:\001\001"
pause

Автор - не я, где-то подсмотрел. )))
Код удаляет все пустые папки в каталоге D:\001\001, сколько бы их там ни было.
Но в каталоге помимо пустых папок есть такие папки:

%Common Desktop%
%Common Programs%
%System%
001
002
003
C_
SysDlls

Из-за "%" в названиях папок батник сходит с ума. Переименовывать папки нельзя. Путь D:\001\001 может быть любым. Сторонние утилиты использовать нельзя. Расширенную обработку команд использовать крайне нежелательно.
В инете все перерыл, ответа не нашел. Статей по этому вопросу, даже игнорируя ограничения выше, никаких не встретил.
Если есть идеи, просьба поделиться.

Отправлено: 17:02, 29-06-2020

 

Аватара для Fors1k

Старожил


Сообщения: 193
Благодарности: 112

Профиль | Отправить PM | Цитировать


Цитата whitejoy:
Код удаляет все пустые папки в каталоге D:\001\001 »
PowerShell
Код: Выделить весь код
param(
    $path='D:\001\001'
)cls

(gci $path -dir).FullName|
%{if(!(gci $_)){ri -l $_}}
Это сообщение посчитали полезным следующие участники:

Отправлено: 18:21, 29-06-2020 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

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


Ветеран


Contributor


Сообщения: 2708
Благодарности: 1684

Профиль | Отправить PM | Цитировать


Код: Выделить весь код
@Echo Off 
	Set "BoxIn=D:\001\001"
	FOR /F "usebackq delims=" %%d IN (`2^>nul Dir "%BoxIn%" /B /A:D`) DO 2>nul Rd "%BoxIn%\%%d"
Exit /B

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.

Это сообщение посчитали полезным следующие участники:

Отправлено: 18:25, 29-06-2020 | #3


Ветеран


Сообщения: 1274
Благодарности: 564

Профиль | Отправить PM | Цитировать


тот же код что и у megaloman, только показать что работает без проблем и в глубину:
Код: Выделить весь код
@echo off
for /f "delims=" %%a in ('dir /ad/b/s "D:\papka"') do 2>nul rd /q "%%a"
pause
Это сообщение посчитали полезным следующие участники:

Отправлено: 22:33, 29-06-2020 | #4


Новый участник


Сообщения: 3
Благодарности: 0

Профиль | Отправить PM | Цитировать


Цитата alpap:
@echo off
for /f "delims=" %%a in ('dir /ad/b/s "D:\papka"') do 2>nul rd /q "%%a"
pause »
код в целом рабочий, спасибо большое, только один минус: если папка становится пустой после удаления из нее единственной пустой папки, то код ее уже не удаляет.

Код от Fors1k, к сожалению, не понимаю. С Power Shell не дружу, попробовал просто впихнуть код в чистый батник - не сработало.

Код от Fors1k, к сожалению, не понимаю. С Power Shell не дружу, попробовал просто впихнуть код в чистый батник - не сработало.

Отправлено: 08:29, 30-06-2020 | #5


Ветеран


Contributor


Сообщения: 2708
Благодарности: 1684

Профиль | Отправить PM | Цитировать


whitejoy, Вы не писАли, что надо удалять пустые папки в подпапках. Здесь это не раз обсуждалось.
Код: Выделить весь код
@Echo Off
	Set "BoxIn=D:\001\001"
	FOR /F "usebackq delims=" %%d IN (`2^>nul Dir "%BoxIn%" /S /B /A:D ^|Sort /R`) DO 2>nul Rd "%%d"
Exit /B
Цитата whitejoy:
попробовал просто впихнуть код в чистый батник »
Это способ впихнуть невпихуемое

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 30-06-2020 в 09:03.

Это сообщение посчитали полезным следующие участники:

Отправлено: 08:51, 30-06-2020 | #6


Новый участник


Сообщения: 3
Благодарности: 0

Профиль | Отправить PM | Цитировать


Цитата megaloman:
whitejoy, Вы не писАли, что надо удалять пустые папки в подпапках. Здесь это не раз обсуждалось. »
Насчет папок в подпапках, честно говоря, я думал, по моему коду это видно. ))

Спасибо огромное! Код ниже отрабатывает идеально!

Цитата megaloman:
@Echo Off
Set "BoxIn=D:\001\001"
FOR /F "usebackq delims=" %%d IN (`2^>nul Dir "%BoxIn%" /S /B /A:D ^|Sort /R`) DO 2>nul Rd "%%d"
Exit /B »
Один вопрос, если можно для общего развития: я правильно понимаю, "^|Sort /R" отвечает за удаление папок, ставших пустыми во время работы кода?
Можете, если не сложно, пояснить назначение конструкции "^|Sort /R"?

Отправлено: 09:19, 30-06-2020 | #7


Ветеран


Contributor


Сообщения: 2708
Благодарности: 1684

Профиль | Отправить PM | Цитировать


whitejoy,
Цитата whitejoy:
я думал, по моему коду это видно »
я не читатель, я писатель .
не сложно, пояснить назначение конструкции "^|Sort /R
Что делает Dir? Выдаёт список папок, например,
dir Z:\Box_In\ /s /a:D /B
Код: Выделить весь код
Z:\Box_In\001
Z:\Box_In\001\002
Z:\Box_In\001\002\003
Z:\Box_In\001\002\003\004
Z:\Box_In\001\002\003\004\005
Z:\Box_In\001\002\003\004\005\006
Допустим, ни в одной папке файлов нет
Что делает Rd "папка"? Пытается удалить "папка", попытка будет успешна, если "папка" пустая, иначе ошибка.
Что произойдет, если сделать в приведенном примере Rd "Z:\Box_In\001"? Папка удалена не будет, так как она не пустая - есть подпапки.
Аналогично Rd "Z:\Box_In\001\002" .... Rd "Z:\Box_In\001\......005"
Если в For ставим Dir в таком виде, то удалится только последняя пустая папка цепочки
Z:\Box_In\001\002\003\004\005\006,
так как все предыдущие папки, выданные Dir непустые.
Команда Sort /R в данном контексте позволяет отсортировать вывод команды Dir в обратном алфавитном порядке, то есть,
dir Z:\Box_In\ /s /a:D /B |sort /R
Код: Выделить весь код
Z:\Box_In\001\002\003\004\005\006
Z:\Box_In\001\002\003\004\005
Z:\Box_In\001\002\003\004
Z:\Box_In\001\002\003
Z:\Box_In\001\002
Z:\Box_In\001
И здесь Rd уже последовательно удаляет реально пустые подпапки, начиная с самого нижнего уровня.
Шляпа ^ в For надо для так называемого экранирования служебного символа | перенаправления вывода команды Dir на вход команды Sort для корректной работы For, в простой командной строке она не нужна

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 30-06-2020 в 10:38.


Отправлено: 10:26, 30-06-2020 | #8


Ветеран


Сообщения: 1274
Благодарности: 564

Профиль | Отправить PM | Цитировать


Цитата megaloman:
Sort /R »
точно, упустил из виду.

Отправлено: 14:14, 30-06-2020 | #9



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Бесконечный цикл, если в имени папки есть знак процента

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - [решено] бесконечный цикл выполнения из bat n_i_x Скриптовые языки администрирования Windows 9 24-06-2020 00:13
После выключения компьютер входит в бесконечный цикл LamoSS Непонятные проблемы с Железом 2 07-02-2020 19:36
CMD/BAT - [решено] Сворачивание консольного окна, если в имени запускаемого файла есть скобки V!RTuE Скриптовые языки администрирования Windows 1 27-02-2015 19:28
Разное - Программа для решения простых Судоку (бесконечный цикл) m.s.dos Программирование и базы данных 3 07-01-2009 05:05
бесконечный цикл. Функция не возвращает FALSE ? xamelion Вебмастеру 5 19-09-2005 14:21




 
Переход