提前:我是批量或编程的新手,所以请尽量解释。
我的问题:
我想删除目录Z中的所有不名为 X 和 Y 的文件夹(例如D:\ Test \ z)
所以让我们说Z包含这些文件夹:
我需要通过脚本仅删除备份和资源。 为了不删除具有特定名称的一个文件夹,我查找了多个灵魂,但我不知道批量的多个值是否可能。
答案 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
命令开始迭代之前,%扩展%只会一次。您可能会寻找"延迟扩张"在这个论坛中进一步解释这一点。