我需要一个简单的批处理文件,它可以搜索包含多个文件夹(名称各异)的“F:\Temp”目录,查找名为“Subs”的子文件夹,并删除它们以及“Subs”文件夹可能包含的任何文件。使用此处的类似问题,我构建了以下脚本,但似乎找不到目录中的“Subs”文件夹。
for /f %%i in ("F:\Temp\***\Subs") do rd /s "%%~i"
需要注意的是,我不知道/f %%i
和 有什么关系%%~i
。另外,我不确定我的通配符是否设置正确。需要说明的是,下面的文件夹F:\Temp
名称各异,没有相似之处。我唯一想查找和删除的是Subs
中这些名称各异的文件夹中的子文件夹F:\Temp
。
答案1
我想删除Subs
目录中命名的子目录F:\Temp
以下应该有效:
@echo off
setlocal enabledelayedexpansion
cd /d f:\Temp
for /f "tokens=*" %%i in ('dir /a:d /b /s Subs') do (
echo "%%i"
rem rd /s "%%i"
)
检查输出,如果它与正确的子目录匹配,则删除rem
之前的内容。rd
我不
/f %%i
知道
它是命令的参数for
。
FOR 命令的操作可以概括为......
- 取一组数据
- 使
FOR
参数%%G
等于该数据的某一部分- 执行命令(可选择使用参数作为命令的一部分)。
- 对每一项数据重复上述步骤
看For - 循环命令 - Windows CMD - SS64.com完整解释
随着
%%~i
这毫无意义
我不确定我的通配符
F:\Temp\***\Subs
是否设置正确
子目录名称中间不能有通配符。它们必须位于末尾。
进一步阅读
答案2
您还可以使用以下方式执行此操作For /R [Folder] /D
:
@echo off
for /r "F:\Temp" /d %%i in (*Subs
)do echo\%%~nxi & rmdir /s /q "%%~dpnxi"
观察:为了确保要删除的文件夹包含字符串,而不是名称中\Subs
包含该字符串的其他文件夹,我建议使用以下命令进行过滤:subs
| find "\Strings"
for...()do echo\%%~dpi%%~nxi | find /i "\Subs" && run rd ...
- 您的批处理将仅删除在字符串的路径和名称中找到的文件夹
\Subs
,并且您的批处理将如下所示:
@echo off
for /r "F:\Temp" /d %%i in (*Subs)do (
echo\%%~dpi%%~nxi | find /i "\Subs" && rd /s /q "%%~dpnxi"
)
熟悉以下命令将会对你有所帮助:
For
For /r
For /d
For loop expanding variables
- 使用
For
循环可以扩展变量:
%~i - expands %i removing any surrounding quotes (")
%~fi - expands %i to a fully qualified path file/dir name only
%~ni - expands %i to a file/dir name only
%~xi - expands %i to a file/dir extension only
%%~nxi => expands %%~i to a file/dir name and extension
Use the FOR variable syntax replacement: %~pi - expands %i to a path only %~ni - expands %i to a file name only %~xi - expands %i to a file extension only
The modifiers can be combined to get compound results: %~pni - expands %i to a path and file name only %~pnxi - expands %i to a path, file name and extension only
观察.: 关于使用%%~nxi
在directory
名称观察注释中ss64.com
:
Full Stop Bug Although Win32 will not recognise any file or directory name that begins or ends with a '.' (period/full stop) it is possible to include a Full Stop in the middle of a directory name and this can cause issues with FOR /D.
Parameter expansion will treat a Full Stop as a file extension, so for a directory name like "Sample 2.6.4" the output of %%~nI will be truncated to "Sample 2.6" to return the whole folder name use %%I or %%~nxI
所有for /d
目录都会在循环中列出,并且它们的源名称将在中%%~nxi
,可以在echo\%%~nxi & rmdir /s /q "%%~dpnxi"
命令语法中使用。