有没有办法从 for 循环中的通配符中排除某些 values/variables

Is there a way to exclude certain values/variables from a wildcard in a for loop

for /d %%A IN (u:\mainfolder\*) DO if not exist "%%A\%var1%" mkdir "%%A\subfolder"

我想排除目录 u:\mainfolder\ 中的某些文件夹,以便 mkdir 对其中的几个文件夹以外的所有文件夹执行。有没有办法排除使用通配符的某些文件夹?

如果您只有 2 或 3 个要排除,您可以这样做。

for /d %%A IN (u:\mainfolder\*) DO if /i not "%%A"=="u:\mainfolder\Name1ToExclude" if /i not "%%A"=="u:\mainfolder\Name2ToExclude" if not exist "%%A\%var1%" mkdir "%%A\subfolder"

否则,如果您有更多,您可能想要使用 table 个名称来排除。

命令 FOR 不支持排除选项。

但是任务可以通过FOR执行的命令DIRFINDSTR来完成.

@echo off
set "MainFolder=U:\mainfolder"
for /F "delims=" %%A in ('dir "%MainFolder%\*" /AD /B ^| %SystemRoot%\System32\findstr.exe /E /I /L /V /X /C:"Exclude Folder 1" /C:ExcludeFolder2 /C:FolderToExclude3 2^>nul') do if not exist "%MainFolder%\%%A\%var1%" mkdir "%MainFolder%\%%A\subfolder"
set "MainFolder="

由于选项/AD(属性目录)和/B(裸格式)。目录名由 DIR 输出,没有路径,只有目录名。

使用重定向运算符 |.

DIR 的输出通过管道作为输入传递给 FINDSTR

FINDSTR 在所有行中搜索使用选项 /C 指定的字符串之一作为文字字符串,因为选项 /L 未包含在双引号中或由于目录名称包含 space 字符或以下字符之一,因此用双引号引起来:&()[]{}^=;!'+,`~

由于选项 /I,搜索不区分大小写。

只有当输入行与搜索字符串完全匹配时,匹配才是肯定的,因为 /X 这意味着整个目录名称必须与其中一个搜索字符串完全匹配。

选项 /V 导致 FINDSTR 的反向输出。它不打印与其中一个搜索字符串匹配的行,而是打印不与任何搜索字符串匹配的行(=目录名称)。

过滤后的不带路径的目录名由FOR.

逐行处理

重定向运算符|>必须在最终执行的命令行中使用脱字符^进行转义:

dir "U:\mainfolder\*" /AD /B | C:\Windows\System32\findstr.exe /E /I /L /V /X /C:"Exclude Folder 1" /C:ExcludeFolder2 /C:FolderToExclude3 2>nul

此命令行由 FOR 在后台启动的单独命令进程中执行。重定向运算符 |> 必须使用 ^ 进行转义,以便在 [=106] 解析整个 FOR 命令行时将其解释为文字字符=] 命令解释器在执行命令 FOR 与行的其余部分之前。

在更长的要排除的目录列表中,我建议将目录名称写入纯文本文件并使用 FINDSTR 的选项 /G: 而不是全部指定在命令行上使用 /C:

要了解使用的命令及其工作原理,请打开命令提示符 window,在其中执行以下命令,并仔细阅读为每个命令显示的所有帮助页面。

  • dir /?
  • echo /?
  • findstr /?
  • for /?
  • set /?

另请阅读有关 Using Command Redirection Operators 的 Microsoft 文章。