【问题标题】:Understand how batch do when there is a goto command nested into a for loop了解当 goto 命令嵌套在 for 循环中时批处理如何执行
【发布时间】:2013-05-17 22:59:34
【问题描述】:

理解批处理运行语义的一个非常简单的问题。请看这段代码

FOR /F %%x IN (file.txt) DO (
if /i "%~1"=="%%x" goto :label
if /i "%~1"=="%%xYZ" goto :label
)
:label
......

跳转到标签后,然后batch会自动回到for循环吗? 如果是这样,有没有办法让它回到 for 循环? 谢谢

【问题讨论】:

    标签: batch-file goto


    【解决方案1】:

    goto 命令将跳转到一个标签并在您的示例中跳出循环,但是,您应该可以使用call,它可以用于调用标签作为子程序:

    for /F %%x in (file.txt) do (
    if /i "%~1"=="%%x" call :label
    if /i "%~1"=="%%xYZ" call :label
    )
    
    :: end script here
    exit /b 0
    
    :label
    

    来自call page on the Microsoft TechNet site

    调用 [[驱动器:][路径] 文件名 [批处理参数 ]] [:label [参数]]

    ...

    : label : 指定您希望批处理程序控件跳转到的标签。通过使用带有此参数的 call,您可以创建一个新的批处理文件上下文并将控制权传递给指定标签后的语句。第一次遇到批处理文件的结尾(即跳转到标签后),控制返回到call语句之后的语句...

    【讨论】:

    • 批处理编程有时可能更复杂!感谢您的帮助,您的解释帮助太大了!
    • 你也可以用goto :eof代替exit /b 0(刚刚从Rob van der Woude学到的)。
    【解决方案2】:

    如果label 在批处理文件中的 for 循环之后,那么,不,批处理文件不会返回到 for 循环

    【讨论】:

    • 有没有办法让它回到 for 循环?谢谢
    • 标签在哪里并不重要。即使标签在循环内,GOTO 也会立即终止循环。
    • 我认为你的意思是你想从 for 循环中调用一个函数,然后让循环从它停止的地方继续。如果该函数很复杂,您可能希望将其放在另一个批处理文件中,否则您可以将代码放在 for 循环内的 if 语句中。这篇文章展示了如何在你的 IF 中做一个 OR 语句:stackoverflow.com/questions/2143187/…
    【解决方案3】:

    而且您也无法访问该变量。 我建议调用另一个批处理文件并将 %%x 传递给它。这是最接近子程序的地方。

    【讨论】:

    • 如果我通过调用 :label 替换 goto:label 是否会改变某些东西,该标签是在同一个批处理文件中定义的标签?谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-21
    • 1970-01-01
    相关资源
    最近更新 更多