Arquivo em lote para excluir arquivos da pasta curinga

Arquivo em lote para excluir arquivos da pasta curinga

Como crio um arquivo em lote que exclui arquivos de vários diretórios?

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- o questionador acrescenta-

Tenho cerca de cem desses diretórios. Não quero deletar as pastas, apenas os arquivos. Todos eles possuem uma pasta L3 e todos contêm alguns arquivos com a mesma extensão. Esses são apenas arquivos temporários, mas não são excluídos automaticamente.

Responder1

ARQUIVO EM LOTE PARA EXCLUIR DE SUBPASTAS COM NOMES DIFERENTES DINAMICAMENTE USANDO CURINGA PARA NOMES DE SUBPASTAS

Arquivo em lote para excluir arquivos da pasta curinga

Aqui está um exemplo de script em lote fácil e simples que uso para concluir esse tipo de tarefa o tempo todo. Conectei os caminhos de pasta variáveis ​​para atender às suas necessidades conforme você descreve:

EXEMPLO DE SCRIPT DE LOTE

(Defina sua pasta raiz variável e subpasta no topo, e os FOR /D loops FORe iteram de acordo para fazer o resto da mágica percorrendo o diretório conforme a lógica especifica e completa o DEL /Q /Fcomando para os *.txtarquivos)

@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

OBSERVAÇÃO: Se você planeja executar isso copiando e colando manualmente no prompt de comando, as variáveis ​​no FOR os loops precisam ter um dos sinais de porcentagem removidos em todas as partes, então use o abaixo para essa parte se você estiver executando manualmente com copiar e colar, em vez de em um script em lote e executando assim que o exemplo acima funcionará.

FOR /D %X IN ("%SourceDir%\*") DO FOR %Y IN ("%~X\%SourceSubDir%\*.txt") DO DEL /Q /F "%~Y"

MAIS DETALHES E PESQUISAS

(Digitar FOR /? no prompt de comando do Windows para ver este detalhe)

PARA (sem 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.

Responder2

Interpretando sua linha \L1\*\L3\*. Como: Para um determinado diretório L1, encontre todos os subdiretórios que possuem um subdiretório L3 e exclua todos os arquivos nele.

Um script deve ser escrito para percorrer a estrutura de diretórios. Não é fácil executá-lo como um arquivo em lote, talvez seja necessário usar Perl ou PowerShell, que possuem maneiras de obter uma lista de diretórios ou arquivos e, em seguida, executar uma ação repetida sobre eles.

Em 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

Vou pensar sobre isso e fiz isso em código de arquivo em lote, embora esteja pensando em refazê-lo no PowerShell só para ver a diferença.

Ok, pensei sobre isso

Este arquivo em lote percorrerá a estrutura de diretórios de onde é executado e excluirá o conteúdo de qualquer diretório que tenha o nome "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

Pode ser possível torná-lo mais simples, mas a ação de obter apenas o nome do diretório atual é confusa (o loop for na seção do processo)

Se um diretório começar assim

└───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

execute cleantree deve ficar assim

└───L1
    │   1.dat
    ├───Alice
    │   │   9.dat
    │   │
    │   └───L3
    ├───Bob
    │       6.dat
    ├───Carole
    │   │   2.dat
    │   │
    │   └───L3
    └───Ted
            6.dat

Responder3

for /f %G in ('dir /ad /b D:\L1\') do del D:\L1\%G\L3\*.txt

for /fexecuta o seguinte comando do em todos os arquivos no conjunto

%G in ('dir /ad /b D:\L1\')variável definida como o formato básico para cada pasta dentro de um determinado diretório

comando delete usando definir valor% G e curinga para o diretório


Teste primeiro

execute com echo para imprimir no console os comandos que serão executados para testar o comando sem realmente executá-lo:

for /f %G in ('dir /ad /b D:\L1\') do echo del D:\L1\%G\L3\*.txt

informação relacionada