涉及以下答案:https://stackoverflow.com/a/54425285/14503335
首先我所想我的理解:
"%$set%"
将内容扩展为有效命令,并且由于换行符,“解析器”将执行每个 %\n%
作为命令。
问题:
:initMacro
是否捕获所有行或仅捕获set $set=FOR /L %%N in (1 1 2) dO IF %%N==2 ( %\n%
...) else setlocal DisableDelayedExpansion^&set argv=?
if "!!"==""
endlocal
?(goto) 2>nul
以及它实际上有什么作用?%$set%
并执行已在 :initMacro
处的命令? (%%~1
)
:initMacro
是否捕获所有行或仅捕获set $set=FOR /L %%N in (1 1 2) dO IF %%N==2 ( %\n% ... ) else setlocal DisableDelayedExpansion^&set argv=?
$set
包含所有行,直到第一行缺少 %\n%
,因为 %\n%
包含单个插入符和一个换行符。它将所有线连接在一起if "!!"==""
endlocal
仅执行一次endlocal
?setlocal
,第一个在:
) else setlocal DisableDelayedExpansion^&set argv=
下一个在set $set=FOR /L %%N in (1 1 2) dO IF %%N==2 ( %\n% setlocal EnableDelayedExpansion
(goto) 2>nul
,它实际上有什么作用?(goto) 2>nul
删除一个堆栈调用级别,但执行仍保留在当前代码块内。其中两个将删除两个调用堆栈级别,在这种情况下,它们以干净的方式退出批处理文件。