Я хочу удалить определенную папку в корне и подпапках, проблема в том, что мой код удаляет только папку в корне каталога:
SET dirname=test
SET directory=%cd%
SET found=false
if NOT "%1%" == "" (
set directory=%1%
)
echo Searching for %dirname% in %directory%
for /d %%i in (%directory%\%dirname%) do (
IF EXIST %%i (
REM change the sentinel value
set found=true
echo Deleting the folder %%i
REM Delete a folder, even if not empty, and don't prompt for confirmation
RD /s /q %%i
)
)
REM logic to do if no files were found
if NOT "%found%" == "true" (
echo No directories were found with the name of %dirname%
)
Вот структура папок:
E:sampledelete
├───folder1
├───folder2
│ └───somefolder
├───test
│ └───somefolder
├───newfolder
│ ├───test
│ │ └───somefolder
├───newfolder2
│ ├───test
после запуска скрипта он изменился на:
E:sampledelete
├───folder1
├───folder2
│ └───somefolder
├───newfolder
│ ├───test
│ │ └───somefolder
├───newfolder2
│ ├───test
решение1
Проблемы аннотированы ниже. Основной проблемой было неправильное представление о каталоге: вы не смотрели внутрь каталога ниже 1 узла под корнем. У вас была правильная идея. Поскольку вы "новичок", как вы сказали, стоило бы проанализировать различия.
@echo off
SET dirname=test
SET directory=%cd%
SET found=false
if NOT "%1%" == "" (
set directory=%1%
)
REM We want to look in the current directory not in for Z:\test
for /d %%i in (%directory%*) do (
echo Searching for %%i\%dirname% in %directory%
REM We already know the folder existed because "do" ran.
REM We want to look beneath the root directory
IF EXIST %%i\%dirname% (
REM change the sentinel value
set found=true
REM we want to delete the nodes beneath not the one in root
echo Deleting the folder %%i\%dirname%
REM Delete a folder
REM we want to delete the nodes beneath not the one in root
RD /s /q %%i\%dirname%
)
IF %%1 == %dirname% (
REM change the sentinel value
set found=true
REM Delete a folder, even if not empty, and don't prompt for confirmation
echo Deleting the folder %%i\%dirname%
RD /s /q %%i
)
)
REM logic to do if no files were found
if NOT "%found%" == "true" (
echo No directories were found with the name of %dirname%
)
решение2
Вы не понимаете, что for /d
происходит.
для /d %%i в (dir 1 файл 1 dir 2 файл 2 dir 3 файл 3) делатьзаявление
делает
SET %%i=dir1
statement
SET %%i=dir2
statement
SET %%i=dir3
statement
Проблема в том, что вы говорите только , где находится . Вы хотите использовать , который выполняет рекурсивный поиск в каталоге. Ваш цикл должен выглядеть примерно такfor /d %%i in (dir1) do statement
dir1
%directory%\%dirname%
for /r
for /r %directory% %%i in (.) do (
if exist %%i\%dirname% (
REM change the sentinel value
set found=true
echo Deleting the folder %%i\%dirname%
REM Delete a folder, even if not empty, and don't prompt for confirmation
RD /s /q %%i\%dirname%
)
)