16

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

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

4

1 回答 1

21

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

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

此外,如果您的脚本(或例程)是 CALLed,那么当 CALL 完成时,对于在 CALLed 例程中发出的每个活动 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
于 2012-12-05T16:52:33.023 回答