una todos subcarpetas script por para fecha eliminar contenido con como comando carpetas carpeta borrar batch automaticamente archivos archivo batch-file cmd

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

  1. ( 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

  2. ( rmdir ) Redirige el web.config como entrada al comando rmdir . Esto bloqueará el archivo para que no se pueda eliminar hasta que el comando finalice. El rmdir . /s /q rmdir . /s /q eliminar todo lo que no esté bloqueado dentro (y debajo) del directorio activo actual

  3. ( popd ) Cancele el comando pushd 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

  1. ( 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

  2. ( for ) Prepare una referencia (un nombre aleatorio) en una carpeta temporal para usar

  3. ( robocopy ) Copie solo los archivos web.config (y su jerarquía de carpetas) de la carpeta de origen a la carpeta temporal

  4. ( robocopy ) robocopy la carpeta temporal a la carpeta de origen. Esto eliminará cualquier archivo / carpeta no incluida en la copia temporal

  5. ( rmdir ) Eliminar la carpeta temporal

  6. ( popd ) Cancele el comando pushd 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:

  1. Esto también eliminó el archivo, no quería.
  2. 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 por rd /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 archivo del 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 usar rd también.