Показать полную графическую версию : [решено] Бесконечный цикл, если в имени папки есть знак процента
whitejoy
29-06-2020, 17:02
Прошу помочь.
Есть такой код батника:
@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 может быть любым. Сторонние утилиты использовать нельзя. Расширенную обработку команд использовать крайне нежелательно.
В инете все перерыл, ответа не нашел. Статей по этому вопросу, даже игнорируя ограничения выше, никаких не встретил.
Если есть идеи, просьба поделиться.
Код удаляет все пустые папки в каталоге D:\001\001 »
PowerShell
param(
$path='D:\001\001'
)cls
(gci $path -dir).FullName|
%{if(!(gci $_)){ri -l $_}}
megaloman
29-06-2020, 18:25
@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
тот же код что и у megaloman, только показать что работает без проблем и в глубину:
@echo off
for /f "delims=" %%a in ('dir /ad/b/s "D:\papka"') do 2>nul rd /q "%%a"
pause
whitejoy
30-06-2020, 08:29
@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 не дружу, попробовал просто впихнуть код в чистый батник - не сработало.
megaloman
30-06-2020, 08:51
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
30-06-2020, 09:19
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 »
Один вопрос, если можно для общего развития: я правильно понимаю, "^|Sort /R" отвечает за удаление папок, ставших пустыми во время работы кода?
Можете, если не сложно, пояснить назначение конструкции "^|Sort /R"?
megaloman
30-06-2020, 10:26
whitejoy, я думал, по моему коду это видно »я не читатель, я писатель :). Что делает Dir? Выдаёт список папок, например,
dir Z:\Box_In\ /s /a:D /BZ:\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 /RZ:\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, в простой командной строке она не нужна
Sort /R »
точно, упустил из виду.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.