![Пакетный файл для удаления файлов из папки wildcard](https://rvso.com/image/1476429/%D0%9F%D0%B0%D0%BA%D0%B5%D1%82%D0%BD%D1%8B%D0%B9%20%D1%84%D0%B0%D0%B9%D0%BB%20%D0%B4%D0%BB%D1%8F%20%D1%83%D0%B4%D0%B0%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F%20%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%20%D0%B8%D0%B7%20%D0%BF%D0%B0%D0%BF%D0%BA%D0%B8%20wildcard.png)
Как создать пакетный файл, который удаляет файлы из нескольких каталогов?
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