2009-02-17 17 views
11

Estoy buscando una secuencia de comandos DOS para eliminar todos los archivos y subdirectorios en un directorio raíz a excepción de un conjunto de archivos por lotes (* .bat) que están en el directorio raíz. ¿Hay algún deportista de DOS que conozca una manera fácil de hacer esto?¿Cómo puedo eliminar todos los archivos/subdirectorios excepto algunos archivos en DOS?

actualización

Gracias por su ayuda a todos. Aquí es donde estoy ahora (ver abajo). Estoy usando la sugerencia de Ken para eliminar los archivos. Me gustaría saber cómo puedo detener la ejecución de este script si los comandos del o RD fallan debido a un bloqueo en un archivo/directorio. Alguien sabe como? En este momento, este script hará muchas cosas después de las eliminaciones y me gustaría detener el script si cualquiera de las eliminaciones falla.

@echo off 

REM ********************************************************************* 
REM * Delete all files and subdirs except for batch files in the root * 
REM ********************************************************************* 

REM Delete all files in current dir except bat files. Does this by a) setting the attributes of *.bat files to 
REM readonly and hidden, b) deleting the rest, c) reseting the attributes 

attrib +r +s *.bat 
del *.* /S /Q 
attrib -r -s *.bat 

REM Deletes ALL subdirectories 

FOR /D %%G in (*) DO RD /s /q %%G 
+0

Esto significa: ¿No elimina CUALQUIER archivo .bat en el directorio raíz? O ¿No elimina ESTOS .bat SI están en el directorio raíz? – colithium

+0

No elimine _any_ .bat archivos en la raíz –

Respuesta

20

Puede establecer los atributos de los archivos que desea conservar a sólo lectura y oculto en primer lugar, eliminar el resto, y luego restablecer los atributos de la archivos ocultos, solo de nuevo.

attrib +r +s *.bat 
del *.* 
attrib -r -s *.bat 

que solía hacer que muy a menudo, y escribió un archivo por lotes que automatiza este:

@echo off 
@ if "%1" == "%9" goto help 
@ if /i %1 EQU ? goto help 
@ if /i %1 EQU help goto help 
@ attrib +h +s %1 
@ %2 %3 /Q 
@ attrib -h -s %1 
@ goto :EOF 
:help 
@echo  ╔═══════════════════════════════════════════════════════╗ 
@echo  ║ except filespec1 doscommand filespec2     ║ 
@echo  ║              ║ 
@echo  ║ filespec1 The files to exclude from doscommand  ║ 
@echo  ║ doscommmand The DOS command to execute on filespec2 ║ 
@echo  ║ filespec2 The files to execute doscommand against ║ 
@echo  ║              ║ 
@echo  ║ Example:            ║ 
@echo  ║              ║ 
@echo  ║ except *.txt del *.*         ║ 
@echo  ║              ║ 
@echo  ║Deletes all files except text files in the directory ║ 
@echo  ╚═══════════════════════════════════════════════════════╝ 

es probable que sea bien sólo para usar el atributo oculto, pero sé que del no toca archivos ocultos del sistema, así que configuré ambos. Mejor prevenir que lamentar, IMO.

Sobre la base de un comentario de Marcus: Si desea ampliar esta incluir los subdirectorios del directorio actual, basta con cambiar las dos líneas attrib a

attrib <remainder of line> /S 

y cambiar la línea entre las dos líneas attrib a

@ %2 %3 /Q /S 

Eso debería funcionar para la mayoría de las cosas que desearía que hiciera except.bat.

+0

Esta es una gran idea. También necesito eliminar todos los subdires (y sus contenidos). Parece que esta secuencia de comandos solo elimina archivos no * .bat en la raíz. –

+0

Marcus, he actualizado la publicación para mostrar la inclusión de subdirectores también. –

2

fijo basado en @ comentario de Ken:

>d: 
>mkdir bats 
>c: 
>copy *.bat d:\bats 
>del *.*/Y 
>copy d:\bats\*.bat c:\ 
+0

Aún conserva la secuencia de comandos de dosataques en su sistema ;-) – dirkgently

+0

Vaya, no, no es así. Pero, ¿qué hace '/ Y'? – dirkgently

+0

Respuestas Y a la pregunta "¿estás seguro?" –

0

Esto se basa en el método de Alex de copia de seguridad de los archivos .BAT, pero también elimina todas las subcarpetas, utilizando el comando RD.

@echo off 

rem !WARNING! 
rem THE_DELETE_DRIVE is the drive to delete 
rem THE_BACKUP_DRIVE is the drive to use for backup 
set THE_DELETE_DRIVE=T: 
set THE_BACKUP_DRIVE=C: 
rem !WARNING! 

echo This will recursively delete everything from %THE_DELETE_DRIVE%\ (except batch files). 
echo Are you sure? Press Ctrl+C to cancel, or any other key to continue... 
echo. 
pause 

rem Make the backup folder 
md %THE_BACKUP_DRIVE%\bak12345 

rem Copy all batch files from delete-drive root to backup folder 
copy %THE_DELETE_DRIVE%\*.bat %THE_BACKUP_DRIVE%\bak12345 

rem Delete everything in the delete-drive root 
rd /s/q %THE_DELETE_DRIVE%\ 

rem Copy all backed-up files back to delete-drive root 
copy %THE_BACKUP_DRIVE%\bak12345\*.bat %THE_DELETE_DRIVE%\ 

rem Remove the backup folder 
rd /s/q %THE_BACKUP_DRIVE%\bak12345 

echo ************************************ 
echo All Done! 
echo ************************************ 
echo. 

pause 
Cuestiones relacionadas