2012-05-01 10 views
8

Ho una cartella denominata x con un numero di sottocartelle e file. Voglio eliminare una cartella denominata y che è presente in x e tutte le sue sottocartelle. La suddetta cartella che deve essere cancellata può contenere o meno file. Credo di poterlo fare usando cmd o qualche tipo di file batch, ma sono una nuova riga di comando e posso davvero usare un po 'di aiuto.Come rimuovere tutte le cartelle del nome x all'interno di una directory utilizzando il file cmd/batch

Una cosa semplice sarebbe trovare il nome della cartella, che funziona ma credo che ci siano modi migliori che rimuovere ogni cartella singolarmente .. come un loop che attraversa tutte le cartelle.

Grazie

EDIT: Giusto per chiarire, io sono y (la cartella che deve essere cancellato) all'interno di x, e può essere in una qualsiasi delle sottocartelle di x ed a qualsiasi livello di profondità. Inoltre sto guardando le risposte e potrebbe volerci del tempo per accettare qualsiasi risposta. Si prega di portare con me :)

risposta

7

Ecco un'altra soluzione per questa commentato per descrivere ogni parte dello script:

@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 

Si può prendere il /p dal fronte delle variabili iniziali e basta inserire i loro valori dopo la = se don 't desidera che venga richiesta:

set foldername= 
set root= 

È possibile anche rimuovere il echo nella porzione di anello e la pause nella porzione terminale per il lotto per l'esecuzione in silenzio.

Potrebbe essere un po 'più complicato, ma il codice può essere applicato a molti altri usi.

ho provato alla ricerca di istanze multiple dello stesso FolderName qwerty in C:\Test:

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

e tutto ciò che è stato lasciato era:

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

Prenditi cura di utilizzare che ...

per il 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 

il comando FOR viene utilizzato per scorrere un elenco di file o variabili , le opzioni sono molto facili da memorizzare, Directory solo in modo ricorsivo.

+0

si può spiegare un po 'su cosa esattamente si fa? che cos'è un fileprefix? e quelle bandiere .. provandolo ora. – Achshar

+0

Spero che questo link possa aiutarti. http://www.robvanderwoude.com/batchcommands.php – StarPinkER

+2

@Achshar: In pratica, metti il ​​nome della cartella Y invece di 'fileprefix' (' ... IN (Y *) DO ... '). Inoltre, metti il ​​percorso della cartella X tra '/ R' e' %% X' (Jermaine ha perso il fatto che l'opzione '/ R' richiede un argomento, che è una cartella root da attraversare). E ancora una cosa, dovrai anche aggiungere una condizione per assicurarti di eliminare una cartella 'Y' e non una' Ysomething' che corrisponda anche alla maschera 'Y *'. Qualcosa come questo potrebbe fare: '... DO IF" %% ~ nxX "==" Y "RD ...'. –

1

Un problema comune a questo tipo di argomenti è che se ci sono istanze della cartella di destinazione a diversi livelli, la maggior parte dei metodi causa un errore perché quando una cartella di alto livello viene cancellata, tutte le cartelle sottostanti scompaiono. Per esempio:

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 

esempio precedente generare una lista di 4 cartelle di nome Y, che viene cancellato, ma dopo il primo viene cancellato non esistono più i tre nomi restanti, causando un messaggio di errore quando si è tentato di eliminare . Capisco che questa sia una possibilità nel tuo caso.

Per risolvere questo problema, è necessario eliminare le cartelle nell'ordine dal basso, ovvero la cartella più interna deve essere cancellata per prima e la cartella di livello superiore deve essere eliminata per ultima.Il modo per ottenere questo è attraverso un subroutine ricorsiva:

@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 

Anche se in questo caso particolare i problemi causati da altri metodi sono solo più messaggi di errore, ci sono altri casi in cui questo ordine di elaborazione è fondamentale.

0

Fai .bat con le seguenti:

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

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