在批处理文件中,如果满足一个条件而不是周围的 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
不能是l
ess 或eq
ual 到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 语句?的主要内容,如果未能解决你的问题,请参考以下文章