【问题标题】:Exit a loop when a value was found找到值时退出循环
【发布时间】:2023-03-08 07:01:01
【问题描述】:

我有一个包含几行的文件:

"pathToFile=%~dp0PBreport\cpy\Install\"

更多,我有一个具有不同搜索值的字符串列表:

"searchValue=abc,there,rtz"

我的目标是搜索文件的每一行以查找搜索值的出现,然后执行一些代码。但是,如果可能找到我的搜索值列表中的第一个元素,则无需检查其他值。 我用一个嵌套的 foo 循环来完成整个事情,但是当我实现类似GOTO 的东西时,外部循环不会继续。在循环中使用 GOTO 是否有一些错误?或者是否有更好的方法来退出并跳过所有其他检查(如果已经找到)? 没有GOTOstatement,完整的代码工作没有问题。

FOR /f "tokens=1 delims=" %%G in (%pathToFile%) do (
  set "dataRow=%%~G"
  FOR %%I in (%searchValue%) do ( 
      IF not "!dataRow:%%I=!"=="!dataRow!" (
      ### some Code here ###
      GOTO endIfCases
      )
  )
  ###some similiar blocks like the one above which can also be ignored if one match was found beforehand###

  :endIfCases
  ### some Code which needs to be excecuted at the end of each loop from the outer FOR###
)

【问题讨论】:

  • GOTO 命令执行其编程的操作。转到代码中的预定义标签并从那里开始执行。这将打破您正在执行的任何FOR 命令。
  • 这就是我想要它做的事情。然而,他似乎也没有继续外循环 FOR /f 因为我的输出只有一个值
  • 正如我所说,它破坏了您正在执行的 ANY FOR commands。你需要调用一个标签来做你想做的事情。
  • 嗯,我明白了,好的,我会尝试这样做,谢谢
  • 还记得一周前我给你this example的时候吗? 这是一个基本的三行示例:1. @Set "listPC=Win10,Motherboard,USB-Port,Core", 2. @Set "dummyline=Environment,1234,ZUIOP,Core", 3. @For %%# In (%listPC%)Do Echo("%%#"|FindStr /IL "\"%dummyline:,= %\"">NUL&&(Echo Searchstring %%# is in String to Test&Pause)我>。这与您现在所问的相差多远?

标签: loops for-loop batch-file cmd exit


【解决方案1】:

此方案简单高效:

FOR /f "tokens=1 delims=" %%G in (%pathToFile%) do (
  set "dataRow=%%~G"
  set "break="
  FOR %%I in (%searchValue%) do if not defined break ( 
      IF not "!dataRow:%%I=!"=="!dataRow!" (
      ### some Code here ###
      set "break=1"
      )
  )
  ###some similiar blocks like the one above which can also be ignored if one match was found beforehand###

  ### some Code which needs to be excecuted at the end of each loop from the outer FOR###
)

【讨论】:

    【解决方案2】:

    你能把你的代码安排成这样吗(根据需要将参数传递给子程序):

    FOR /f "tokens=1 delims=" %%G in (%pathToFile%) do (
       CALL :YourSubr "Parm1" "Parm2"
         ### some Code which needs to be excecuted at the end of each loop from the outer FOR###
    )
    GOTO :eof
    
    :YourSubr
    REM 1=???
    REM 2=???
    set "dataRow=%%~G"
    FOR %%I in (%searchValue%) do ( 
       IF not "!dataRow:%%I=!"=="!dataRow!" (
       ### some Code here ### using passed parameters
       )
    )
    

    我看到您正在使用延迟扩展,但您的代码没有显示 SETLOCAL...所以要小心放置 ENDLOCAL 的位置。

    【讨论】:

    • 据我了解,OP 希望在未找到一个值后取消对其余值的处理。您的解决方案始终处理所有值...也许您忘记了GOTO;)
    猜你喜欢
    • 2021-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-22
    相关资源
    最近更新 更多