“list-contains”操作的批处理命令

时间:2013-06-20 08:05:14

标签: list command-line batch-file logical-operators

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

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"

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

3 个答案:

答案 0 :(得分:5)

使用嵌套的IF s

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

答案 1 :(得分: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"
)

答案 2 :(得分: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"