批处理文件以从通配符文件夹中删除文件


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"

请注意barlop-提问者添加-

我大约有一百个目录。我不想删除文件夹,仅删除文件。它们都有一个L3文件夹,并且都包含一些具有相同扩展名的文件。这些只是临时文件,但不会自动删除。


您还没有说出自己遇到的错误
barlop 2015年

你可以说del a.a b.b
barlop 2015年

是“*” 确实是文件名(删除在这里起作用)还是仅仅是一些不必要的HTML标记(然后请只写真实的文件名)?
Werner Henze 2015年

抱歉,以前它无法正确显示*,因此我使用HTML代码显示(*)。但是我不确定为什么现在可以使用。
Andrew Lay 2015年

哦,您想要一个带有通配符的rmdir。我想我不会那样做。我将要删除的文件列表放到一个文件中。然后,在它们之前加上“ del”一词,然后将该文件制作为批处理文件并运行它。这也很安全,因为您可以看到要删除的内容。您可以在notepad ++中打开文件列表,并用^查找每一行的开头,并用“ del”替换它
barlop

Answers:


0

动态使用WILDCARD的子名称从具有不同名称的子名称删除批处理文件

批处理文件以从通配符文件夹中删除文件

这是一个简单的批处理脚本示例,我一直使用它来完成此类任务,我插入了可变文件夹路径以适应您所描述的需求:

样品批处理脚本

(将变量根文件夹和子文件夹放在最上面,并且FOR /D and 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"

进一步的细节和研究

在Windows命令提示符中键入FOR /? 以查看此详细信息)

FOR(不带开关)

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.

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.