Arquivo em lote para excluir arquivos da pasta curinga

1

Como faço para criar um arquivo em lotes que exclua 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"

Observação por barlop-questioner adiciona -

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

    
por Andrew Lay 10.12.2015 / 08:00

3 respostas

0

ARQUIVO DE LOTE PARA EXCLUIR DE SUBFOLDERS COM NOMES DIFERENTES USANDO DINAMICAMENTE WILDCARD PARA NOMES DE SUBCOMPLAÇÃO

Batch file to delete files from wildcard folder

Aqui está um exemplo de script em lote fácil e simples que eu uso para concluir esse tipo de tarefa o tempo todo. Eu pluguei os caminhos das pastas variáveis para atender às suas necessidades como você descreve:

SCRIPT DO LOTE DA AMOSTRA

(Defina a sua pasta raiz e subpasta variável no topo, e o FOR /D e FOR faz um loop de acordo para fazer o resto da mágica percorrendo o diretório conforme a lógica especifica e completa a% ComandoDEL /Q /F para os arquivos *.txt )

@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ê pretende executar isso com uma cópia e colar manualmente no prompt de comando, as variáveis nos loops FOR precisam tenha um dos sinais de porcentagem removidos em todas as partes, então use o abaixo para essa parte se você estiver executando isso manualmente com um copiar e colar em vez de um script em lote e executando aquele que é como 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

(Digite FOR /? no prompt de comando do Windows para ver esse detalhe)

FOR (sem comutador)

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:

FOR / 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.
    
por 12.12.2015 / 04:35
0

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

Um script deve ser escrito para percorrer a estrutura de diretórios. Ele não é facilmente factível como um arquivo em lotes, você pode ter que usar Perl ou PowerShell que tem maneiras de obter lista de diretórios ou arquivos e, em seguida, fazendo uma ação repetida sobre eles.

no pseudo có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

Eu vou pensar sobre isso e fiz isso em código de arquivo em lotes, embora Estou pensando em refazer isso em powershell apenas para ver a diferença.

Ok, eu pensei sobre isso

Esse arquivo em lote percorre a estrutura de diretórios de onde é executado e apague 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 de 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

executar cleantree deve se parecer com isso

└───L1
    │   1.dat
    │
    ├───Alice
    │   │   9.dat
    │   │
    │   └───L3
    ├───Bob
    │       6.dat
    │
    ├───Carole
    │   │   2.dat
    │   │
    │   └───L3
    └───Ted
            6.dat
    
por 11.12.2015 / 11:39
0
for /f %G in ('dir /ad /b D:\L1\') do del D:\L1\%G\L3\*.txt

for /f é executado após o comando do em todos os arquivos no conjunto

%G in ('dir /ad /b D:\L1\') variable definida como o formato simples para cada pasta no diretório especificado

delete command usando o conjunto% G value & curinga para o diretório

Teste de execução primeiro

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

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