2012-05-01 20 views
8

Tengo una carpeta llamada x con varias subcarpetas y archivos. Quiero eliminar una carpeta llamada y que está presente en x y todas sus subcarpetas. Dicha carpeta que debe eliminarse puede contener o no archivos. Creo que puedo hacer esto usando cmd o algún tipo de archivo por lotes, pero soy un nuevo bi de línea de comando y realmente puedo usar algo de ayuda.Cómo eliminar todas las carpetas de nombre x dentro de un directorio usando el archivo cmd/batch

Una cosa simple sería encontrar el nombre de la carpeta, que funciona, pero creo que hay mejores formas de eliminar cada carpeta individualmente ... como un bucle que recorre todas las carpetas.

Gracias

EDIT: Solo para aclarar, tengo y (la carpeta que debe ser eliminado) en el interior de x, y puede estar en cualquiera de las subcarpetas de x y en cualquier nivel de profundidad. También estoy buscando respuestas y puede tomar algún tiempo para que acepte cualquier respuesta. Por favor tengan paciencia conmigo :)

Respuesta

7

Aquí es otra solución para esta comentado para describir cada parte del guión:

@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 

Puede tomar el /p a cabo desde el frente de las variables iniciales y simplemente introducir sus valores después de la = si don 't desea que se le pregunte:

set foldername= 
set root= 

también puede quitar el echo en la porción de bucle y la pause en la parte final de la tanda para la instalación silenciosa.

Puede ser un poco más complicado, pero el código se puede aplicar a muchos otros usos.

he comprobado en busca de varias instancias de la misma foldername qwerty en C:\Test:

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

y todo lo que quedaba era:

C:\Test\ 
C:\Test\test\ 
C:\Test\test\test\ 
4
FOR /D /R %%X IN (fileprefix*) DO RD /S /Q "%%X" 

Tenga cuidado de usar ese ...

para el comando 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 

el comando FOR se utiliza para recorrer una lista de archivos o variables , las opciones son muy fáciles de memorizar, Directorio solo recursivamente.

+0

puede explicar un poco sobre qué es exactamente lo que hace? ¿Qué es fileprefix? y esas banderas ... intentándolo ahora. – Achshar

+0

Espero que este enlace pueda ayudarte. http://www.robvanderwoude.com/batchcommands.php – StarPinkER

+2

@Achshar: Básicamente, ponga el nombre de la carpeta Y en lugar de 'fileprefix' (' ... IN (Y *) DO ... '). Además, coloque la ruta de la carpeta X entre '/ R' y' %% X' (Jermaine omitió el hecho de que el modificador '/ R' requiere un argumento, que es una carpeta raíz para recorrer). Y una cosa más, también necesitarás agregar una condición para asegurarte de que estás eliminando una carpeta 'Y' y no un' Ysomething' que también coincidiría con la máscara 'Y *'. Algo como esto podría hacer: '... DO IF" %% ~ nxX "==" Y "RD ...'. –

1

Un problema común a este tipo de temas es que si hay instancias de la carpeta de destino en varios niveles, la mayoría de los métodos causan un error porque cuando se elimina una carpeta de alto nivel, desaparecen todas las carpetas que se encuentran debajo de ella. Por ejemplo:

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 

ejemplo anterior genera una lista de 4 carpetas con el nombre Y que se eliminará, pero después de la primera de ellas se suprime ya no existen los tres nombres restantes, provocando un mensaje de error cuando se intentan eliminar . Entiendo que esta es una posibilidad en tu caso.

Para resolver este problema, las carpetas se deben eliminar en orden ascendente, es decir, la carpeta más interna se debe eliminar primero y la carpeta de nivel superior se debe eliminar al final.La manera de lograr esto es a través de una subrutina recursiva :

@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 

Aunque en este caso particular, los problemas causados ​​por otros métodos son sólo varios mensajes de error, hay otros casos en los que esta orden de procesamiento es fundamental.

0

.bat con Make siguiente:

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

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