有没有办法从 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执行的命令DIR和FINDSTR来完成.
@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 文章。
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执行的命令DIR和FINDSTR来完成.
@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 输出,没有路径,只有目录名。
使用重定向运算符 |
.
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 文章。