首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >批处理/ CMD脚本删除文件夹,但不包括多个文件夹

批处理/ CMD脚本删除文件夹,但不包括多个文件夹
EN

Stack Overflow用户
提问于 2016-03-22 11:08:06
回答 2查看 1.4K关注 0票数 1

预告:我对批处理或编程都是新手,所以请尽可能多地解释。

我的问题是:

我想删除目录Z (ex )中的所有文件夹,而不是名为X和Y的。D:\\测试\z)

因此,假设Z包含以下文件夹:

  • 备份
  • 资源
  • project1
  • project2
  • project3

我只需要排除通过脚本删除备份和资源。

我查找了多个解决方案,因为它不只是删除具有特定名称的一个文件夹,但我不知道是否可以使用批处理实现多个值。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-03-22 11:14:54

未测试:

代码语言:javascript
运行
复制
@echo off

set "root_dir=C:\Z"
set "exclude_list=backup resources"
pushd "%root_dir%"
for /f "tokens=* delims=" %%# in ('dir /b /a:d^| findstr /v "%exclude_list%"') do (
   echo rd /s /q "%%~f#"
)

如果这看起来不错,请删除最后一行的echo以激活删除。

如果要删除的所有文件夹都类似于project*,也可以尝试:

代码语言:javascript
运行
复制
for /d %%a in ("project*") do rd /s /q "%%~fa"
票数 0
EN

Stack Overflow用户

发布于 2016-03-22 12:02:28

代码语言:javascript
运行
复制
@echo off
setlocal EnableDelayedExpansion

rem Define working variables
set "dir=D:\Test\z"
set "exclude=/backup/resources/"

rem Change current dir to working dir
cd /D "%dir%"
rem Process all folders in this dir
for /D %%f in (*) do (
   rem If current folder is not in "exclude" var
   if "!exclude:/%%f/=!" equ "%exclude%" (
      rem Delete it
      ECHO rd /s /q "%%f"
   )
)

此方法仅使用内部cmd.exe命令,因此它比其他可能使用外部.exe文件(如findstr.exe)的方法运行得更快。

检测名称是否在排除变量中的方法是尝试从该变量中删除该名称:"%exclude:/%%f/=%":如果结果等于原始变量内容,则文件夹不存在。该方法非常简单和高效,并且工作原理与字母大小写无关,因此它不需要在/I命令中使用任何忽略大小写开关。

名称用斜杠分隔,以避免部分名称匹配造成的任何问题;为此,%%f部件被if命令中的斜杠括起来。

注意,%%f的值在for命令的每次迭代中都会发生变化。因此,exclude变量被感叹号包围,而不是百分号,setlocal EnableDelayedExpansion命令在开始时就给出了;否则,%展开%将在for命令开始迭代之前只执行一次。你可以在这个论坛上寻找“延迟扩展”,以进一步解释这一点。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36152772

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档