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

Posted

技术标签:

【中文标题】在批处理文件中,如果满足一个条件而不是周围的 for 循环,如何突破嵌套的 if 语句?【英文标题】:Within a batch file, how can one break out of nested if statements if one criteria is met, but not the surrounding for loop? 【发布时间】:2020-11-13 05:29:52 【问题描述】:

这就是我所拥有的......

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 循环重新开始。这可能吗?如果是这样,那到底是怎么做到的?提前致谢。

【问题讨论】:

那么您想对不在您排除列表中的每个用户执行该命令吗? 你可以使用GOTO标签跳出FOR循环 @HackingAddict1337。 goto 将完全跳出循环,你不能 goto 在括号内的代码块内。 请提供所有实际的if 语句,(如果它们都是相同的If "!USR!" Neq "something",只需提供所有实际的something 【参考方案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 不能是less 或equal 到tes

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

关于您的最后一条评论。不,它不能假设如果一个不匹配,其余的也不匹配。这是一个场景:

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

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

您希望它退出,因为pete 不是sam,所以它必须运行命令,但是,下一个if 会匹配。因此,我必须针对所有排除项对每个用户进行评估..

【讨论】:

是的,我确实考虑过一个排除列表,使用另一个 for 循环,但有些排除是部分用户名,例如 (If "!USR:~0,3!" Neq "_12" ) 或 (如果 "!USR:~-5!" Neq "_test")。 然后设置变量并继续if not "!USR:~0,3!" == "_12" If "!USR:~-5!" Neq "_test" 直线。这将意味着,如果其中任何一个是真实的,它将完成其余的工作。我将在答案中发布一个简单的示例,您可以测试并查看该概念。 我也为你添加了答案的差异 而且,如果满足其中一个条件,是否将所有“if not”组合在一行中,是否允许该行立即中断...从而使代码运行得更快?跨度> 好吧,不。每个用户都需要根据每个条件进行评估。如果它是需要匹配用户而不排除用户的另一种方式,它将在找到匹配项后立即运行该命令。

以上是关于在批处理文件中,如果满足一个条件而不是周围的 for 循环,如何突破嵌套的 if 语句?的主要内容,如果未能解决你的问题,请参考以下文章

当条件不满足时,while循环退出而不是循环

如何在变量批处理脚本中处理空间

如何继续循环vba

SwiftUI:如果满足条件,如何为文本添加边框?

Python如何读取csv文件某一列的每一行数据,并判断该数值是不是满足条件?

Matlab-在滑动窗口周围放置边框