Knu*_*ius 0 command-line list batch-file logical-operators
我有这个命令遍历目录中的所有文件夹并删除所有文件夹,除了一个:
FOR /D %i IN ("Directory\*") DO IF /I NOT "%i" == "FolderToKeep" RD /S/Q "%i"
Run Code Online (Sandbox Code Playgroud)
现在我需要它来保留两个特定文件夹而不是一个.起初我认为这只是为比较添加一些简单的OR逻辑,但似乎批处理不支持OR和AND等逻辑运算符.那么实现这一目标的最佳方法是什么?如果OR命令不存在,可能有一些功能可以让你测试变量是否包含在列表中?这样的事可能吗?
FOR /D %i IN ("Directory\*") DO IF /I NOT "%i" IN "FolderToKeep","FolderToKeep2" RD /S/Q "%i"
Run Code Online (Sandbox Code Playgroud)
我不熟悉批量编码,如果这看起来微不足道,请原谅.
尝试使用嵌套的IFs
FOR /D %i IN ("Directory\*") DO (
IF /I NOT "%i" == "FolderToKeep" (
IF /I NOT "%i" == "FolderToKeep2" RD /S/Q "%i"
)
)
Run Code Online (Sandbox Code Playgroud)
方法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"
)
Run Code Online (Sandbox Code Playgroud)
通过使用所需值列表定义变量,然后尝试从列表中删除特定值,可以轻松实现"测试变量是否包含在列表中":如果列表更改,则值在列表中.此方法的唯一细节是使用不能出现在值中的分隔符来分隔列表中的值,并在删除特定值时包含相同的分隔符.
此外,由于此方法需要延迟扩展,因此不能在命令行中使用它(除非您以前启用它).
@echo off
setlocal EnableDelayedExpansion
set foldersToKeep=/FolderToKeep/FolderToKeep2/
FOR /D %%i IN ("Directory\*") DO (
IF "!foldersToKeep:/%%~Ni/=!" equ "%foldersToKeep%" RD /S/Q "%%i"
)
Run Code Online (Sandbox Code Playgroud)
暂时,在你的方法中你应该"%~Ni"只使用文件夹名称,因为FOR返回的名称列表包括Directory\...部分,也就是说,没有办法"Directory\FolderToKeep"等于"FolderToKeep".