batch - 关于宏“函数”(goto,endlocal)的问题来自另一个问题的答案

问题描述 投票:0回答:1

涉及以下答案:https://stackoverflow.com/a/54425285/14503335

首先我所想我的理解:

"%$set%"
将内容扩展为有效命令,并且由于换行符,“解析器”将执行每个
%\n%
作为命令。

问题:

  1. :initMacro
    是否捕获所有行或仅捕获
    set $set=FOR /L %%N in (1 1 2) dO IF %%N==2 ( %\n%
    ...
    ) else setlocal DisableDelayedExpansion^&set argv=?
  2. 为什么脚本会交叉检查DelayedExpansion是否被激活?
    if "!!"==""
  3. 翻倍的原因是什么
    endlocal
  4. 加倍的原因是什么
    (goto) 2>nul
    以及它实际上有什么作用?
  5. 脚本是否捕获
    %$set%
    并执行已在
    :initMacro
    处的命令? (
    %%~1
    )


    “要使用它,了解宏本身如何工作并不重要。”

    😒
batch-file cmd
1个回答
0
投票
  1. :initMacro
    是否捕获所有行或仅捕获
    set $set=FOR /L %%N in (1 1 2) dO IF %%N==2 ( %\n% ... ) else setlocal DisableDelayedExpansion^&set argv=?
  • $set
    包含所有行,直到第一行缺少
    %\n%
    ,因为
    %\n%
    包含单个插入符和一个换行符。它将所有线连接在一起
  1. 为什么脚本会交叉检查DelayedExpansion是否被激活?
    if "!!"==""
  • 出现了 3 次,第一个是如果延迟扩展处于活动状态,则停止脚本,因为这样该宏将被错误定义,感叹号将被删除。
  • 宏中的第一次出现是决定调用宏时是否启用或禁用延迟扩展的路径。
  • 第三次出现是一个门,确保
    endlocal
    仅执行一次
  1. 翻倍的原因是什么
    endlocal
  • 因为宏启动时总是有两个
    setlocal
    ,第一个在:
     ) else setlocal DisableDelayedExpansion^&set argv=
    下一个在
    set $set=FOR /L %%N in (1 1 2) dO IF %%N==2 ( %\n% setlocal EnableDelayedExpansion 
  1. 加倍的原因是什么
    (goto) 2>nul
    ,它实际上有什么作用?
  • (goto) 2>nul
    删除一个堆栈调用级别,但执行仍保留在当前代码块内。其中两个将删除两个调用堆栈级别,在这种情况下,它们以干净的方式退出批处理文件。
© www.soinside.com 2019 - 2024. All rights reserved.