gpt4 book ai didi

batch-file - 为什么 CALL 在这个脚本中打印 GOTO 帮助信息?为什么之后的命令会被执行两次?

转载 作者:行者123 更新时间:2023-12-04 06:58:25 25 4
gpt4 key购买 nike

Here's one interesting thread .我试着玩弄那里讨论的两件事。

  • 您可以访问带有双重扩展的特殊符号的标签。
  • 包含 /? 的标签无法使用,因为 GOTOCALL打印他们的帮助信息而不是执行。

  • 结果如下:
    @echo off

    setlocal enableDelayedExpansion
    set "label=/?"

    call :%%label%%
    echo == Test message to check if the CALL or GOTO ( or neither ) command is executed ==

    exit /b 0

    :/?
    echo == CALL or GOTO has been executed ==
    exit /b 0

    和输出:
    Directs cmd.exe to a labeled line in a batch program.

    GOTO label

    label Specifies a text string used in the batch program as a label.

    You type a label on a line by itself, beginning with a colon.

    If Command Extensions are enabled GOTO changes as follows:

    GOTO command now accepts a target label of :EOF which transfers control
    to the end of the current batch script file. This is an easy way to
    exit a batch script file without defining a label. Type CALL /? for a
    description of extensions to the CALL command that make this feature
    useful.
    == Test message to check if the CALL or GOTO ( or neither ) command is executed ==
    == Test message to check if the CALL or GOTO ( or neither ) command is executed ==
    CALL后面的代码被执行两次??

    编辑

    这对我来说更无法解释:
    @echo off

    setlocal enableDelayedExpansion
    set "label=/?"
    set /a x=1
    call :%%label%% >nul

    set /a x=x+1
    echo ---
    echo -%x%-
    echo ---

    exit /b 0

    :/?
    echo == CALL or GOTO has been executed ==
    echo == first argument : %1 ==
    exit /b 0

    输出是:
    ---
    -3-
    ---
    CALL调用后的代码肯定会执行两次,但第一次运行的输出可以重定向到同一行吗?

    最佳答案

    我总是很惊讶,你仍然发现了我从未想过要测试的东西。

    与 Aacini 相反,我不相信 :/?在这里充当有效标签。
    否则这应该找到这样的标签。

    我想 CALL命令内部由堆栈推送器函数组成,然后只需使用 GOTO跳转到标签。

    当您使用后期扩展时,/? CALL 未检测到命令本身,但由 GOTO命令。goto仅显示帮助信息并完成,但显示为 call已经将文件位置推送到堆栈,它的工作方式类似于调用此文件位置,然后返回到相同的位置!

    set "help=^ /?"
    call :myLabel%%help%%

    这也显示了帮助,如 GOTO :myLabel /?会做。
    但这个不
    set "help=/?"
    call :myLabel %%help%%

    我想,GOTO 只获取 CALL 解析的标签,其他参数移动到 %1, %2, ...
    这可以解释为什么只有 标签可以使用两次延迟扩展 .
    @echo off
    setlocal EnableDelayedExpansion
    set "label=myLabel"
    set "pointer=^!label^!"
    call :!pointer!
    exit /b

    :myLabel
    echo it works

    关于batch-file - 为什么 CALL 在这个脚本中打印 GOTO 帮助信息?为什么之后的命令会被执行两次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31987023/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com