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

时间:2016-03-22 11:08:06

标签: batch-file cmd

提前:我是批量或编程的新手,所以请尽量解释。

我的问题:
我想删除目录Z中的所有名为 X Y 的文件夹(例如D:\ Test \ z)

所以让我们说Z包含这些文件夹:

  • 备份
  • 资源
  • PROJECT1
  • 项目2
  • 项目3

我需要通过脚本仅删除备份资源。 为了不删除具有特定名称的一个文件夹,我查找了多个灵魂,但我不知道批量的多个值是否可能。

2 个答案:

答案 0 :(得分:0)

未经测试:

@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*类似,您也可以尝试:

for /d %%a in ("project*") do rd /s /q "%%~fa"

答案 1 :(得分:0)

@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变量中的方法是尝试从中删除此名称:"%exclude:/%%f/=%":如果结果等于原始变量内容,则文件夹/I命令中进行任何if忽略大小写切换。

名称由斜杠分隔,以避免因部分名称匹配而导致的任何问题;因此,%%f部分用if命令中的斜杠括起来。

请注意,%%f命令的每次迭代for的值都会更改。因此,exclude变量被感叹号包围,而百分号和setlocal EnableDelayedExpansion命令在开始时给出;否则,在for命令开始迭代之前,%扩展%只会一次。您可能会寻找"延迟扩张"在这个论坛中进一步解释这一点。