1

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

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"

Записка по гадюке - спрашивающий добавляет-

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

3 ответа3

0

Интерпретация вашей линии \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
0
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
0

Пакетный файл для удаления из вложенных папок с разными именами динамически с использованием 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

FOR /D %variable IN (set) DO command [command-parameters]

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .