【问题标题】:How to clear variables after each batch script run?每次批处理脚本运行后如何清除变量?
【发布时间】:2012-12-05 15:51:45
【问题描述】:

似乎由于我使用 SET 在批处理脚本中声明我的变量,如果我在 cmd 中多次运行它,变量值将持续存在,除非我明确重置它们。

在不关闭 CMD 的情况下,我是否必须使用 setlocal 和 endlocal 来确保一次运行的变量不会持续到另一次运行?

【问题讨论】:

    标签: windows cmd batch-file


    【解决方案1】:

    是的,您应该使用 SETLOCAL。这将本地化任何更改,以便在发出 ENDLOCAL 后恢复旧环境。

    当所有脚本处理完成并返回到命令行上下文时,会为每个活动的 SETLOCAL 发出一个隐式的 ENDLOCAL。无需明确发出 ENDLOCAL。

    此外,如果您的脚本(或例程)被调用,那么当调用完成时,在调用例程中发出的每个活动 SETLOCAL 都会有一个隐式 ENDLOCAL。无需将 ENDLOCAL 放在例程的末尾,(尽管它没有坏处)

    例如

    @echo off
    set var=pre-CALL value
    echo var=%var%
    call :test
    echo var=%var%
    exit /b
    
    :test
    setlocal
    set var=within CALL value
    echo var=%var%
    exit /b
    

    输出:

    var=pre-CALL value
    var=within CALL value
    var=pre-CALL value
    

    CALLed 例程中的ENDLOCAL 永远不会回滚在CALL 之前发出的SETLOCAL。例如。

    @echo off
    setlocal
    set var=VALUE 1
    setlocal
    set var=VALUE 2
    echo before call: var=%var%
    call :test
    echo after call: var=%var%
    endlocal
    echo after endlocal: var=%var%
    exit /b
    
    :test
    setlocal
    set var=VALUE 3
    echo within local CALL context: var=%var%
    endlocal
    echo within CALL after 1st endlocal: var=%var%
    endlocal
    echo within CALL cannot endlocal to before CALL state: var=%var%
    exit /b
    

    结果:

    before call: var=VALUE 2
    within local CALL context: var=VALUE 3
    within CALL after 1st endlocal: var=VALUE 2
    within CALL cannot endlocal to before CALL state: var=VALUE 2
    after call: var=VALUE 2
    after endlocal: var=VALUE 1
    

    【讨论】:

    • 我明白了......所以基本上每个 setlocal 之后的 SET 操作都会在执行完成时被清除。我会试一试。这比我自己清除变量要好。
    猜你喜欢
    • 2011-06-15
    • 1970-01-01
    • 2023-04-09
    • 2013-07-30
    • 1970-01-01
    • 1970-01-01
    • 2012-01-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多