0

我有这个命令遍历目录中的所有文件夹并删除所有文件夹,除了一个:

FOR /D %i IN ("Directory\*") DO IF /I NOT "%i" == "FolderToKeep" RD /S/Q "%i"

现在我需要它来保留两个特定的文件夹,而不仅仅是一个。起初我以为只是在比较中添加一些简单的 OR 逻辑,但似乎批处理不支持 OR 和 AND 等逻辑运算符。那么实现这一目标的最佳方法是什么?如果 OR 命令不存在,也许有功能可以让您测试变量是否包含在列表中?可能是这样的?

FOR /D %i IN ("Directory\*") DO IF /I NOT "%i" IN "FolderToKeep","FolderToKeep2" RD /S/Q "%i"

我不熟悉批处理编码,如果这看起来微不足道,请原谅。

4

3 回答 3

5

“测试变量是否包含在列表中”可以通过使用所需值列表定义变量然后尝试从列表中删除特定值来轻松实现:如果列表更改,则该值在列表中. 此方法的唯一细节是使用不能出现在值中的分隔符分隔列表中的值,并在删除特定值时包含相同的分隔符。

此外,由于此方法需要延迟扩展,因此不能在命令行中使用(除非您之前启用它)。

@echo off
setlocal EnableDelayedExpansion
set foldersToKeep=/FolderToKeep/FolderToKeep2/
FOR /D %%i IN ("Directory\*") DO (
   IF "!foldersToKeep:/%%~Ni/=!" equ "%foldersToKeep%" RD /S/Q "%%i"
)

顺便说一句,在您的方法中,您应该使用"%~Ni"仅获取文件夹名称,因为 FOR 返回的名称列表包括该Directory\...部分,也就是说,没有办法"Directory\FolderToKeep"等于"FolderToKeep".

于 2013-06-20T13:55:59.677 回答
5

IF用嵌套的 s试试

FOR /D %i IN ("Directory\*") DO (
   IF /I NOT "%i" == "FolderToKeep" (
      IF /I NOT "%i" == "FolderToKeep2" RD /S/Q "%i"
   )
)
于 2013-06-20T08:10:22.397 回答
5

方法Aacini

@ECHO OFF &SETLOCAL ENABLEDELAYEDEXPANSION
SET "exclusion=\FolderToKeep\FolderToKeep2\"
FOR /d %%i IN (directory\*) DO (
    IF /i "!exclusion:\%%~nxi\=!" equ "%exclusion%" RD /S/Q "%%~i"
)
于 2013-06-20T13:44:51.637 回答