Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Бесконечный цикл, если в имени папки есть знак процента (http://forum.oszone.net/showthread.php?t=345698)

whitejoy 29-06-2020 17:02 2926691

Бесконечный цикл, если в имени папки есть знак процента
 
Прошу помочь.
Есть такой код батника:

@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 может быть любым. Сторонние утилиты использовать нельзя. Расширенную обработку команд использовать крайне нежелательно.
В инете все перерыл, ответа не нашел. Статей по этому вопросу, даже игнорируя ограничения выше, никаких не встретил.
Если есть идеи, просьба поделиться.

Fors1k 29-06-2020 18:21 2926703

Цитата:

Цитата whitejoy
Код удаляет все пустые папки в каталоге D:\001\001 »

PowerShell
Код:

param(
    $path='D:\001\001'
)cls

(gci $path -dir).FullName|
%{if(!(gci $_)){ri -l $_}}


megaloman 29-06-2020 18:25 2926704

Код:

@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


alpap 29-06-2020 22:33 2926741

тот же код что и у 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 2926775

Цитата:

Цитата 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 не дружу, попробовал просто впихнуть код в чистый батник - не сработало.

megaloman 30-06-2020 08:51 2926778

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
попробовал просто впихнуть код в чистый батник »

Это способ впихнуть невпихуемое

whitejoy 30-06-2020 09:19 2926782

Цитата:

Цитата 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"?

megaloman 30-06-2020 10:26 2926788

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, в простой командной строке она не нужна

alpap 30-06-2020 14:14 2926817

Цитата:

Цитата megaloman
Sort /R »

точно, упустил из виду.


Время: 18:27.

Время: 18:27.
© OSzone.net 2001-