Пакетный файл для удаления файлов из папки wildcard

Пакетный файл для удаления файлов из папки wildcard

Как создать пакетный файл, который удаляет файлы из нескольких каталогов?

D:\L1\asdasda\L3\*.txt
D:\L1\dfghfghfh\L3\*.txt
D:\L1\tyutyugj\L3\*.txt
D:\L1\ytrtyrty\L3\*.txt

Нравиться:

D:
del "d:\L1\*\L3\*.txt"

Примечание от barlop- спрашивающего добавляет-

У меня около сотни таких каталогов. Я не хочу удалять папки, только файлы. У всех из них есть папка L3, и все они содержат какие-то файлы с одинаковым расширением. Это просто временные файлы, но они не удаляются автоматически.

решение1

ПАКЕТНЫЙ ФАЙЛ ДЛЯ ДИНАМИЧЕСКОГО УДАЛЕНИЯ ИЗ ПОДПАПОК С РАЗНЫМИ ИМЕНАМИ С ИСПОЛЬЗОВАНИЕМ ПОДСТАНОВОЧНЫХ ЗНАКОВ ДЛЯ ИМЕН ПОДПАПОК

Пакетный файл для удаления файлов из папки wildcard

Вот простой и легкий пример пакетного скрипта, который я постоянно использую для выполнения такого типа задач. Я подключил переменные пути к папкам в соответствии с вашими потребностями, как вы описали:

ПРИМЕР ПАКЕТНОГО СКРИПТА

(Установите корневую папку и подпапку переменной наверху, а циклы FOR /D и FORбудут итерироваться соответствующим образом, чтобы выполнить остальную часть магии, проходя по каталогу, как указывает логика, и завершать команду DEL /Q /Fдля *.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

ПРИМЕЧАНИЕ: Если вы планируете запустить это вручную, скопировав и вставив в командной строке, то переменные в FOR В циклах необходимо удалить один из знаков процента во всех частях, поэтому используйте приведенный ниже код для этой части, если вы запускаете его вручную с помощью копирования и вставки, а не в пакетном скрипте и выполняете его, как будет работать приведенный выше пример.

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

ДОПОЛНИТЕЛЬНЫЕ ДЕТАЛИЗАЦИИ И ИССЛЕДОВАНИЯ

(Введите FOR /? в командной строке Windows, чтобы увидеть эту информацию)

ДЛЯ (без переключателя)

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 %variable IN (set) DO command [command-parameters]

    If set contains wildcards, then specifies to match against directory
    names instead of file names.

решение2

Интерпретируя вашу строку \L1\*\L3\*. Как: Для заданного каталога L1 найти все подкаталоги, в которых есть подкаталог L3, и удалить все файлы в нем.

Необходимо написать скрипт для обхода структуры каталогов. Это не так просто сделать в виде пакетного файла, вам, возможно, придется использовать Perl или powershell, которые имеют способы получения списка каталогов или файлов, а затем выполнять повторяющиеся действия над ними.

В псевдокоде

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

Я подумаю об этом и сделаю это в коде пакетного файла, хотя думаю переделать это в PowerShell, просто чтобы увидеть разницу.

Хорошо, я подумал об этом.

Этот пакетный файл пройдёт по структуре каталогов, из которых он запущен, и удалит содержимое всех каталогов с именем «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

Возможно, можно сделать проще, но действие по получению только имени текущего каталога запутанное (цикл for в разделе процесса)

Если каталог начинается так

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

запуск cleantree должен выглядеть примерно так

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

решение3

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

for /fзапускает следующую команду do для всех файлов в наборе

%G in ('dir /ad /b D:\L1\')переменная задается как чистый формат для каждой папки в указанном каталоге

команда удаления с использованием заданного значения %G и подстановочного знака для каталога


Тестовый запуск первый

запустите echo, чтобы вывести на консоль команды, которые будут запущены, чтобы протестировать команду без ее фактического запуска:

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

Связанный контент