【发布时间】:2012-12-05 15:51:45
【问题描述】:
似乎由于我使用 SET 在批处理脚本中声明我的变量,如果我在 cmd 中多次运行它,变量值将持续存在,除非我明确重置它们。
在不关闭 CMD 的情况下,我是否必须使用 setlocal 和 endlocal 来确保一次运行的变量不会持续到另一次运行?
【问题讨论】:
标签: windows cmd batch-file
似乎由于我使用 SET 在批处理脚本中声明我的变量,如果我在 cmd 中多次运行它,变量值将持续存在,除非我明确重置它们。
在不关闭 CMD 的情况下,我是否必须使用 setlocal 和 endlocal 来确保一次运行的变量不会持续到另一次运行?
【问题讨论】:
标签: windows cmd batch-file
是的,您应该使用 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
【讨论】: