如何创建从多个目录中删除文件的批处理文件?
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
批处理文件使用通配符动态删除具有不同名称的子文件夹
批处理文件从通配符文件夹中删除文件
这是一个简单易用的批处理脚本示例,我一直用它来完成此类任务,我插入了变量文件夹路径以满足您的需求,正如您所描述的:
批处理脚本示例
(将变量根文件夹和子文件夹设置在顶部,然后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 命令提示符中查看此详细信息)
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:
致/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.
答案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