批处理文件中if语句中的通配符

时间:2019-02-14 18:13:45

标签: batch-file

我正在使用Windows Bactchfile抓取所有不以“ abc”开头的文件夹。因此,忽略文件夹名称abcd和abc123等。似乎IF语句不处理通配符。我该怎么做。

for /D %%A in (*) do ( 
    if not %%A == abc* (Do commands)
)

我找到了一些帮助,说要使用类似下面的内容,但是无法获得正确的语法。

%variable:~offset,length%

我尝试了这种语法,但它不正确:

if not %%A:~0:3 == abc (Do commands)

2 个答案:

答案 0 :(得分:2)

仅给出替代方案而无需使用临时变量(因此不需要delayed expansion):

for %%a in (*) do (
   echo %%a|findstr /ib "abc" || (
     echo Do commands with '%%a'
   )
)

findstr /ib查找以某个子字符串(b)开头的(abc)字符串,而忽略大小写(i
||的工作方式是“如果先前的命令(findstr)失败了”

答案 1 :(得分:0)

for /f "eol=: delims=" %%F in ('dir /b * ^| findstr /vbi abc') do (
  REM your commands processing file %%F here
)

eol=:可能不是必需的。我将其包括在内是因为您不希望排除任何以EOL字符开头的文件,该文件默认为;,并且文件名也可以以;开头。任何文件都不能以:开头,因此对于EOL是安全的。

我之所以选择使用FOR / F,是因为在循环执行任何命令之前,它会缓存整个文件列表,使您可以自由地对这些文件做任何事情,包括重命名它们。

如果使用简单的FOR循环,则重命名的文件可能会被处理两次(或更多!),因为FOR可以在发现文件之前开始处理文件。重命名文件的新名称可能会稍后出现在列表中并得到重新处理。