![Archivo por lotes para eliminar archivos de la carpeta comodín](https://rvso.com/image/1476429/Archivo%20por%20lotes%20para%20eliminar%20archivos%20de%20la%20carpeta%20comod%C3%ADn.png)
¿Cómo creo un archivo por lotes que elimina archivos de varios directorios?
D:\L1\asdasda\L3\*.txt
D:\L1\dfghfghfh\L3\*.txt
D:\L1\tyutyugj\L3\*.txt
D:\L1\ytrtyrty\L3\*.txt
Como:
D:
del "d:\L1\*\L3\*.txt"
Nota de barlop- el interrogador agrega-
Tengo alrededor de cien de esos directorios. No quiero borrar las Carpetas, sólo los archivos. Todos ellos tienen una carpeta L3 y todos contienen algunos archivos con la misma extensión. Esos son sólo archivos temporales, pero no se eliminan automáticamente.
Respuesta1
ARCHIVO POR LOTES PARA ELIMINAR DE SUBCARPETAS CON DIFERENTES NOMBRES DINÁMICAMENTE USANDO COMODÍN PARA LOS NOMBRES DE SUBCARPETAS
Archivo por lotes para eliminar archivos de la carpeta comodín
Aquí hay un ejemplo de secuencia de comandos por lotes fácil y simple que uso para completar este tipo de tarea todo el tiempo. Conecté las rutas de carpetas variables para satisfacer sus necesidades como usted describe:
MUESTRA DE GUIÓN DE LOTE
(Configure su carpeta raíz variable y su subcarpeta en la parte superior, y los bucles FOR /D
y FOR
se iteran en consecuencia para hacer el resto de la magia atravesando el directorio según la lógica especifica y completa el DEL /Q /F
comando para los *.txt
archivos)
@ECHO ON
SET SourceDir=D:\L1
SET SourceSubDir=L3
:: --// note the asterisk wildcard after SourceDir in the first FOR /D loop using X as the variable
:: --// note the X variable appended to the beginning of the second FOR (no /D switch here) loop in the SET part using Y as the variable
FOR /D %%X IN ("%SourceDir%\*") DO FOR %%Y IN ("%%~X\%SourceSubDir%\*.txt") DO DEL /Q /F "%%~Y"
GOTO EOF
NOTA: Si planea ejecutar esto copiando y pegando manualmente en el símbolo del sistema, entonces las variables en el FOR
a los bucles se les debe eliminar uno de los signos de porcentaje en todas las partes, así que use lo siguiente para esa parte si está ejecutando esto manualmente con copiar y pegar en lugar de en un script por lotes y ejecutar así, así es como funcionará el ejemplo anterior.
FOR /D %X IN ("%SourceDir%\*") DO FOR %Y IN ("%~X\%SourceSubDir%\*.txt") DO DEL /Q /F "%~Y"
MÁS DETALLES E INVESTIGACIÓN
(Escribir FOR /?
en el símbolo del sistema de Windows para ver este detalle)
PARA (sin interruptor)
Runs a specified command for each file in a set of files.
FOR %variable IN (set) DO command [command-parameters]
%variable Specifies a single letter replaceable parameter.
(set) Specifies a set of one or more files. Wildcards may be used.
command Specifies the command to carry out for each file.
command-parameters
Specifies parameters or switches for the specified command.
To use the FOR command in a batch program, specify %%variable instead
of %variable. Variable names are case sensitive, so %i is different
from %I.
If Command Extensions are enabled, the following additional
forms of the FOR command are supported:
PARA /D
FOR /D %variable IN (set) DO command [command-parameters]
If set contains wildcards, then specifies to match against directory
names instead of file names.
Respuesta2
Interpretando su línea \L1\*\L3\*. Como: Para un directorio L1 determinado, busque todos los subdirectorios que tengan un subdirectorio L3 y elimine todos los archivos que contiene.
Se debe escribir un script para recorrer la estructura del directorio. No es fácil de realizar como un archivo por lotes; es posible que deba usar Perl o PowerShell, que tienen formas de obtener una lista de directorios o archivos y luego realizar una acción repetida sobre ellos.
En pseudocódigo
Get list directories
For each dir
Cd into it
Check if The dir L3 exists
If it does then del .\L3\*.*
Go back up a level
Next dir
Pensaré en esto y lo hice en código de archivo por lotes, aunque estoy pensando en rehacerlo en PowerShell solo para ver la diferencia.
Ok lo pensé
Este archivo por lotes recorrerá la estructura de directorios desde donde se ejecuta y eliminará el contenido de cualquier directorio que tenga el nombre "L3".
@echo off
for /r %%d in (*) do call :process "%%d"
goto :eof
:process
pushd "%~dp1"
for /f "delims=" %%A in ('cd') do (
set foldername=%%~nxA
)
if "%foldername%"=="L3" del/q *.*
popd
goto :eof
Es posible que sea más simple, pero la acción de obtener solo el nombre del directorio actual es complicada (el bucle for en la sección de proceso)
Si un directorio comienza así
└───L1
│ 1.dat
│
├───Alice
│ │ 9.dat
│ │
│ └───L3
│ c.dat
│ d.dat
│
├───Bob
│ 6.dat
│
├───Carole
│ │ 2.dat
│ │
│ └───L3
│ a.dat
│ b.dat
│
└───Ted
6.dat
ejecutar cleantree debería verse así
└───L1
│ 1.dat
│
├───Alice
│ │ 9.dat
│ │
│ └───L3
├───Bob
│ 6.dat
│
├───Carole
│ │ 2.dat
│ │
│ └───L3
└───Ted
6.dat
Respuesta3
for /f %G in ('dir /ad /b D:\L1\') do del D:\L1\%G\L3\*.txt
for /f
ejecuta el siguiente comando do en todos los archivos del conjunto
%G in ('dir /ad /b D:\L1\')
variable establecida como formato básico para cada carpeta dentro del directorio dado
eliminar comando usando establecer valor %G y comodín para el directorio
Ejecución de prueba primero
ejecute con echo para imprimir en la consola los comandos que se ejecutarán para probar el comando sin ejecutarlo realmente:
for /f %G in ('dir /ad /b D:\L1\') do echo del D:\L1\%G\L3\*.txt