batch-file - todos - script para borrar archivos automaticamente
Comando por lotes para eliminar todo(subcarpetas y archivos) de una carpeta, excepto un archivo (3)
No estoy seguro de dónde está almacenado el archivo web.config o si hay más de uno, así que ...
Solo un archivo web.config
Simplemente bloquee el archivo (redirija el archivo como entrada) y elimine todo lo demás
@echo off
setlocal enableextensions disabledelayedexpansion
pushd "c:/users/data" && >nul 2>nul (
<"web.config" rmdir . /s /q
popd
)
El código
(
pushd
) Cambie a la carpeta de destino (debemos asegurarnos de que esto eliminará la información solo del lugar deseado) configurándolo como el directorio activo actual y bloqueándolo (no podemos eliminar el directorio activo actual). Si el comando puede cambiar a la carpeta, entonces(
rmdir
) Redirige elweb.config
como entrada al comandormdir
. Esto bloqueará el archivo para que no se pueda eliminar hasta que el comando finalice. Elrmdir . /s /q
rmdir . /s /q
eliminar todo lo que no esté bloqueado dentro (y debajo) del directorio activo actual(
popd
) Cancele el comandopushd
restaurando el directorio activo anterior
Varios archivos web.config
en varias carpetas
Siguiendo el enfoque (copiar, limpiar, restaurar) apuntado por @Dominique
@echo off
setlocal enableextensions disabledelayedexpansion
pushd "c:/users/data" && >nul 2>nul (
for %%t in ("%temp%/%~n0_%random%%random%%random%.tmp") do (
robocopy . "%%~ft" web.config /s
robocopy "%%~ft" . /mir
rmdir "%%~ft" /s /q
)
popd
)
El código
(
pushd
) Cambie a la carpeta de destino (debemos asegurarnos de que esto eliminará la información solo del lugar previsto). Si el comando puede cambiar a la carpeta, entonces(
for
) Prepare una referencia (un nombre aleatorio) en una carpeta temporal para usar(
robocopy
) Copie solo los archivosweb.config
(y su jerarquía de carpetas) de la carpeta de origen a la carpeta temporal(
robocopy
)robocopy
la carpeta temporal a la carpeta de origen. Esto eliminará cualquier archivo / carpeta no incluida en la copia temporal(
rmdir
) Eliminar la carpeta temporal(
popd
) Cancele el comandopushd
restaurando el directorio activo anterior
Una vez que se guardan los archivos web.config
, ya que los archivos en la fuente coincidirán con los de la carpeta temporay, no se copiarán con la segunda llamada robocopy
, sino con cualquier archivo / carpeta en la fuente que no esté presente en la carpeta temporal se eliminará para reflejar la estructura en la carpeta temporal.
En primer lugar, las preguntas similares han sido respondidas en pasado pero no exactamente las que tengo. En algunas otras soluciones, se sugirieron ocultar carpetas / archivos y cambiar los atributos, y no quiero esto, a menos que no haya una manera más simple disponible. Además, he intentado la solución sugerida aquí (y un par de otras): comando de MS-DOS para eliminar todos los archivos excepto uno .
Pero no funcionó para mi necesidad debido a dos razones:
- Esto también eliminó el archivo, no quería.
- Esto no eliminó las subcarpetas, sino solo los archivos.
Entonces, tengo la carpeta c:/users/data
y ahí, tengo 5 carpetas y 6 archivos. Quiero eliminar todo menos uno que sea web.config
y para hacerlo ejecuto el archivo por lotes de esta manera:
@echo off
for %%j in (C:/Users/data/*) do if not %%j == Web.config del %%j
pause
Pero cuando ejecuto el archivo por lotes, esto borra todos los archivos, incluido web.config
y, además, no elimina ninguna de las subcarpetas y, si utilizo el /d
, solo elimina las carpetas, no los archivos. ¿Cómo puedo eliminar ambos archivos y carpetas?
También logré hacerlo, muy similar a @aschipfl
For /D %%k in (C:/Users/data) do (For /d %%m in ("%%k/*") do rmdir /s /q "%%m"
For %%m in ("%%k/*") do if not %%m == %%k/Web.config del /q "%%m")
Esta es la forma en que lo haría:
pushd "C:/Users/data" || exit /B 1
for /D %%D in ("*") do (
rd /S /Q "%%~D"
)
for %%F in ("*") do (
if /I not "%%~nxF"=="web.config" del "%%~F"
)
popd
El código básico se toma de mi respuesta a la pregunta Eliminación del contenido de la carpeta, pero no de la carpeta, pero con el comando del
reemplazado por un segundo ciclo for
que recorre todos los archivos y elimina solo los que no tienen el nombre web.config
.
Tenga en cuenta que este enfoque no toca el directorio principal original, ni toca el archivo original web.config
. La gran ventaja de este hecho es que no se perderán atributos (por ejemplo, fecha de creación y propietario).
Explicación
- cambiar al directorio raíz con
pushd
; en caso de falla, omita el resto del script; - iterar a través de todas las subcarpetas inmediatas de la raíz mediante un bucle
for /D
y eliminarlas recursivamente porrd /S
con todos sus contenidos; - iterar a través de los archivos ubicados en la raíz mediante un ciclo
for
normal; use el modificador~nx
de la variable de bucle para expandir el nombre base (n
) y la extensión (x
) de cada archivo, compárelo con el nombre de archivo dado (if
) de una manera insensible a mayúsculas y minúsculas (/I
) y elimine el archivodel
solo en caso de que no coincida (not
); - restaurar el directorio de trabajo anterior por
popd
finalmente;
Los principales problemas en tu código son:
- que compara más que el nombre del archivo puro con el nombre prefigurado, por lo que no se encontrará ninguna coincidencia.
- Necesitaba usar una comparación que no distinga entre mayúsculas y minúsculas, porque a Windows no le importa el caso de los nombres de los archivos para buscar.
- no puso comillas alrededor de las expresiones de comparación, por lo que es probable que reciba mensajes de error de sintaxis, dependiendo de qué caracteres especiales aparecen en los nombres de los archivos.
- que está utilizando el comando
del
solo, que solo elimina archivos; para eliminar directorios, necesitabas usarrd
también.