如何用批处理脚本删除指定路径下所有同名文件夹?
批量删除指定名称的文件夹问题
场景说明
我的目录 C:\Users\blabla 下有多个名为toDelete的文件夹,分布在不同层级,比如:
C:\Users\blabla\toDelete C:\Users\blabla\x1\toDelete C:\Users\blabla\x2\toDelete
需要删除所有这类文件夹,不管其中包含什么内容。
尝试过的操作及问题
1. 用DEL加通配符
执行脚本:
@echo off DEL /Q /F "C:\Users\blabla\**\toDelete"
报错:
The filename, directory name, or volume label syntax is incorrect
2. FOR循环搭配DEL
执行脚本:
@echo off set folder_name=toDelete set folder_path=C:\Users\blabla for /d %%i in ("%folder_path%\*") do ( if /i "%%~nxi"=="%folder_name%" ( DEL /s /q "%%i" ) )
报错一堆全角空格相关的命令识别错误:
'   ' is not recognized as an internal or external command,
operable program or batch file.
'       ' is not recognized as an internal or external command,
operable program or batch file.
...(重复错误提示)
3. 替换为RD加通配符
执行脚本:
@echo off RD /Q "C:\Users\blabla\**\toDelete"
报错:
The system cannot find the path specified.
4. FOR循环搭配RD
执行脚本:
@echo off set folder_name="toDelete" set folder_path="C:\Users\blabla" for /d %%i in ("%folder_path%\*") do ( if /i "%%~nxi"=="%folder_name%" ( RD /s /q "%%i" ) )
无任何输出,但目标文件夹未被删除。
问题根源
- 通配符不支持:CMD原生不支持
**这种递归通配符,所以直接用C:\Users\blabla\**\toDelete会被判定为无效路径。 - 全角空格问题:第二个脚本里的缩进用了全角空格,CMD会把全角空格当作命令的一部分,导致无法识别。
- 引号匹配错误:第四个脚本中给
folder_name赋值时加了引号,判断时"%%~nxi"是toDelete(无引号),而%folder_name%是"toDelete"(带引号),两边不相等,所以删除逻辑没触发。
正确解决方法
方法一:修复CMD脚本
修正引号和缩进问题,同时实现递归查找:
@echo off set "folder_name=toDelete" set "folder_path=C:\Users\blabla" :: 递归遍历目标路径下所有子目录,匹配指定名称的文件夹 for /r "%folder_path%" /d %%i in ("%folder_name%") do ( rd /s /q "%%i" echo 已删除文件夹: %%i ) pause
for /r:递归遍历指定路径下的所有层级目录/d:仅匹配目录,不匹配文件set "变量=值":避免引号干扰后续判断rd /s /q:强制删除文件夹及所有内容,无交互提示
方法二:用PowerShell(更简洁)
如果允许使用PowerShell,一行命令即可完成:
Get-ChildItem -Path "C:\Users\blabla" -Name "toDelete" -Directory -Recurse | Remove-Item -Recurse -Force
或者简写版本:
gci "C:\Users\blabla" -dir -rec -name "toDelete" | ri -rec -force
Get-ChildItem(gci):递归查找所有名为toDelete的目录Remove-Item(ri):强制删除目录及所有内容
内容的提问来源于stack exchange,提问作者Raul Albiol
相关产品推荐
相关产品推荐

