在批处理文件中,如果满足一个条件而不满足周围的for循环,如何才能突破嵌套的if语句?

时间:2020-07-23 13:11:16

标签: loops for-loop batch-file if-statement

这就是我所拥有的...

For /F %%A In ('Type "C:\List.Of.PCs.txt"') Do @(
  Set PC=%%A
  For /F %%B In ('Dir "C:\Users" /B') Do @(
    Set USR=%%B
    If "!USR!" Neq "AAA" (
      If "!USR!" Neq "ABC" (
        If "!USR!" Neq "CDE" (
          If "!USR!" Neq "DEF" (
            [28 more if statements]
            Dir "\\!PC!\C$\Users\!USR!\AppData\Local\Temp\Logs\File.To.Find.Log" >Nul 2>Nul
            If "%ErrorLevel%" Equ "0" Echo File found on !PC! for !USR! >"C:\Results.txt"
          )
        )
      )
    )
  )
)

目标是在仅满足其中一个条件的情况下打破所有这些if语句,然后从最外面的for循环重新开始。这可能吗?如果是这样,那该怎么做?预先感谢。

1 个答案:

答案 0 :(得分:1)

我看到您有一个排除列表,因此,如果您只想排除某些用户,而对其余用户运行该命令,我将执行以下操作:

@echo off
set "exclude=AAA BBB CCC DDD EEE FFF"
For /F %%A In ('Type "C:\List.Of.PCs.txt"') Do @(
for %%I in (%exclude%) do (
  For /F %%B In ('Dir /b "C:\Users"') Do (
    if not "%%B" == "%%I" (
            Dir "\\%%A\C$\Users\%%B\AppData\Local\Temp\Logs\File.To.Find.Log" | findstr /IRC:"File\.To\.Find\.Log" >nul 2>&1
            If errorlevel 0 (Echo File found on %%A for %%B)>>"C:\Results.txt"
      )
    )
  )
)

编辑,根据您的评论,查看这些示例(可以从cmd运行)。

set "var=123"
if not "%var:~1%" == "1" if not "%var:~-1%" == "2" if not "%var:~1%" == "9" echo %var%

由于所评估的位置都不为真,因此上述内容将打印为真。 每个if语句都会被评估,如果其中任何一个不正确,它将执行任务。

但随后:

if not "%var:~1%" == "1" if not "%var:~-1%" == "3" if not "%var:~1%" == "9" echo %var%

将不执行echo,因为未满足评估之一。您可以将它们以任何顺序放置,并且在评估每个对象时仍不会回显。

因此,您的代码可能类似于(未经测试):

@echo off
setlocal enabledelayedexpansion
For /F %%A In ('Type "C:\List.Of.PCs.txt"') Do @(
  For /F %%B In ('Dir /b "C:\Users"') Do (
    set "usr=%%B"
    if not "!usr:~1,3!" == "AAA" if not "!usr:~2,4!" == "BBB" if not "!usr:~1,3!" == "CCC" (
            Dir "\\%%A\C$\Users\!usr!\AppData\Local\Temp\Logs\File.To.Find.Log" | findstr /IRC:"File\.To\.Find\.Log" >nul 2>&1
            If errorlevel 0 (Echo File found on %%A for !usr!)>>"C:\Results.txt"
    )
  )
)

PS !!!如果字符匹配,则if not "var" == "tes"不能度量,其中if 12 equ 12是数学的。您无法执行if "var" leq "tes,因为var不能leq等于tes

有关更多信息,请参见if /?

关于您的最后评论。不,它不能假设其他人也不会匹配。这是一个场景:

Pete是要排除的用户,所以:

if not pete == sam if not pete == pete ...

您期望它退出,因为pete不是sam,因此它必须运行命令,但是下一个if将会匹配。因此,每个用户都必须根据所有排除条件进行评估。