如何在大多数目录上执行代码,但具有批处理文件的文件中列出的代码除外?

时间:2012-02-09 03:30:47

标签: command-line batch-file dos

所以我试图在另一个目录下执行代码,除了那些我在文本文件中列出的目录。因此,例如,如果我想直接在C:\中运行所有目录上的代码,但不要说C:\ avoidme \我会在exclusions.txt中添加C:\ avoidme作为一行。但是我下面的代码似乎没有用。关于如何做到这一点的任何想法?

for /f %%d in ('dir /b C:\') do (
 find /c "C:\%%d" exclusions.txt 
 if %errorlevel% equ 1 (
  Do code here

)

2 个答案:

答案 0 :(得分:2)

@echo off
for /D %%d in (*) do (
    %WINDIR%\system32\find "%%d" exclude.list >nul
    if errorlevel 1 (
        echo good %%d
    ) else (
        echo bad %%d
    )
)

答案 1 :(得分:1)

您的代码不起作用的原因是因为在实际执行FOR语句之前,会立即解析FOR DO()子句的整个主体。但%ERRORLEVEL%的值在解析时扩展,因此您永远不会在执行时看到更新的值。

您还有其他问题

  • 您应该使用DIR / AD选项将列表限制为仅限目录

  • 您对查看FIND命令的输出不感兴趣,因此您可能应该将输出重定向到nul

givendkoa有一个可行的解决方案。

另一种选择是使用延迟扩展

setlocal enableDelayedExpansion
for /f %%d in ('dir /ad /b C:\') do (
  find /c "C:\%%d" exclusions.txt >nul
  if !errorlevel! equ 1 (
    REM Do code here
  )
)

如果它包含!,则%% d会在扩展时破坏该值。这可以通过在循环内切换延迟扩展来解决。

另一种方法是使用||运算符,这意味着如果上一个命令失败,则执行以下命令。

for /f %%d in ('dir /ad /b C:\') do (
  find /c "C:\%%d" exclusions.txt >nul || (
    REM Do code here
  )
)

也许最好的选择是通过使用/ V和/ G:选项直接将DIR的结果直接传递给FINDSTR,以消除排除列表中出现的值,从而无需担心错误级别。

以下是可行的

for /f %%d in ('dir /ad /b C:\ ^| findstr /l /v /g:"exclude.list"') do (
  REM - Do code here
)

但是 - 如果你搜索不同长度的多个文字字符串,会有一个令人讨厌的FINDSTR错误导致它失败。

修复方法是强制FINDSTR使用正则表达式,但是您需要转义可能出现在排除列表中的任何正则表达式元字符。例如,名为myName.ext的目录必须转义为myName\.ext

for /f %%d in ('dir /ad /b C:\ ^| findstr /r /v /g:"exclude.list"') do (
  REM - Do code here
)

其他需要在exclusion.list中转义的字符包括\^$[]