Вопрос по – Как удалить все папки с именем x в каталоге, используя cmd / batch файл

8

У меня есть папка с именем х с несколькими подпапками и файлами. Я хочу удалить папку с именем y, которая присутствует в x, и все ее подпапки. Указанная папка, которая должна быть удалена, может содержать или не содержать файлы. Я полагаю, что могу сделать это, используя cmd или какой-нибудь командный файл, но я являюсь командной строкой нового bi и действительно могу использовать некоторую помощь.

Простым было бы узнать имя папки, которое работает, но я считаю, что есть более эффективные способы, чем удаление каждой папки по отдельности ... как какой-то цикл, который проходит по всем папкам.

Спасибо

РЕДАКТИРОВАТЬ: просто чтобы уточнить, у меня есть y (папка, которая должна быть удалена) внутри х, и это может быть в любой из подпапок х и на любом уровне глубины. Также я смотрю на ответы, и мне может потребоваться некоторое время, чтобы принять любой ответ. Пожалуйста, потерпите меня :)

Ваш Ответ

4   ответа
0

del /q "C:\Users\XXX\AppData\Local\Temp\*"

FOR /D %%p IN ("C:\Users\XXX\AppData\Local\Temp\*.*") DO rmdir "%%p" /s /q
1

характерная для этого типа тем, заключается в том, что если на нескольких уровнях имеются экземпляры целевой папки, большинство методов вызывают ошибку, поскольку при удалении папки высокого уровня все папки, расположенные ниже ее, исчезают. Например:

C:\X\Y\subfolder
C:\X\Y\subfolder\one\Y
C:\X\Y\subfolder\two\Y
C:\X\Y\subfolder\three\Y
C:\X\test
C:\X\test\test

В предыдущем примере был создан список из 4 папок с именем Y, которые будут удалены, но после удаления первой из них три оставшихся имени больше не существуют, что приводит к появлению сообщения об ошибке при попытке удаления. Я понимаю, что это возможно в вашем случае.

Для решения этой проблемы папки должны быть удалены вbottom-up orderто есть самая внутренняя папка должна быть удалена первой, а папка верхнего уровня должна быть удалена последней. Способ достичь этого черезrecursive subroutine:

@echo off
rem Enter into top level folder, process it and go back to original folder
pushd x
call :processFolder
popd
goto :EOF

:processFolder
rem For each folder in this level
for /D %%a in (*) do (
   rem Enter into it, process it and go back to original
   cd %%a
   call :processFolder
   cd ..
   rem If is the target folder, delete it
   if /I "%%a" == "y" (
      rd /S /Q "%%a"
   )
)
exit /B

Хотя в данном конкретном случае проблемы, вызванные другими методами, являются просто множественными сообщениями об ошибках, существуют другие случаи, когда этот порядок обработки является фундаментальным.

5
FOR /D /R %%X IN (fileprefix*) DO RD /S /Q "%%X"

для команды RD:

/S      Removes all directories and files in the specified directory
        in addition to the directory itself.  Used to remove a directory
        tree.
/Q      Quiet mode, do not ask if ok to remove a directory tree with /S

команда FOR используется для циклического просмотра списка файлов или переменных, параметры запоминаются очень просто, только для каталога - рекурсивно.

Error: User Rate Limit Exceeded Achshar
Error: User Rate Limit Exceededrobvanderwoude.com/batchcommands.php
Error: User Rate Limit Exceededfileprefix (… IN (Y*) DO …Error: User Rate Limit Exceeded/RError: User Rate Limit Exceeded%%XError: User Rate Limit Exceeded/RError: User Rate Limit ExceededYError: User Rate Limit ExceededYsomethingError: User Rate Limit ExceededY*Error: User Rate Limit Exceeded… DO IF "%%~nxX" == "Y" RD ….
Error: User Rate Limit ExceededechoError: User Rate Limit ExceededRD.
7

чтобы описать каждую часть сценария:

@Echo OFF
REM Important that Delayed Expansion is Enabled
setlocal enabledelayedexpansion
REM This sets what folder the batch is looking for and the root in which it starts the search:
set /p foldername=Please enter the foldername you want to delete: 
set /p root=Please enter the root directory (ex: C:\TestFolder)
REM Checks each directory in the given root
FOR /R %root% %%A IN (.) DO (
    if '%%A'=='' goto end   
    REM Correctly parses info for executing the loop and RM functions
    set dir="%%A"
    set dir=!dir:.=!
    set directory=%%A
    set directory=!directory::=!
    set directory=!directory:\=;!   
    REM Checks each directory
    for /f "tokens=* delims=;" %%P in ("!directory!") do call :loop %%P
)
REM After each directory is checked the batch will allow you to see folders deleted.
:end
pause
endlocal
exit
REM This loop checks each folder inside the directory for the specified folder name. This allows you to check multiple nested directories.
:loop
if '%1'=='' goto endloop
if '%1'=='%foldername%' (
    rd /S /Q !dir!
    echo !dir! was deleted.
)
SHIFT
goto :loop
:endloop

Вы можете взять/p перед исходными переменными и просто введите их значения после= если вы не хотите, чтобы вас приглашали:

set foldername=
set root=

Вы также можете удалитьecho в части цикла иpause в конечной части для партии, чтобы бежать тихо.

Это может быть немного сложнее, но код может быть применен для многих других целей.

Я проверил его на наличие нескольких экземпляров одного и того же имениqwerty вC:\Test:

C:\Test\qwerty
C:\Test\qwerty\subfolder
C:\Test\test\qwerty
C:\Test\test\test\qwerty

и все, что осталось, было:

C:\Test\
C:\Test\test\
C:\Test\test\test\

Похожие вопросы