似乎因为我在批处理脚本中使用 SET 来声明我的变量,所以如果我在 cmd 中多次运行它,变量值将持续存在,除非我明确地重置它们。
在不关闭 CMD 的情况下,我是否必须使用 setlocal 和 endlocal 来确保一次运行中的变量不会持续到另一次运行?
最佳答案
是的,你应该使用 SETLOCAL。这将本地化任何更改,以便在发出 ENDLOCAL 后恢复旧环境。
当所有脚本处理完成并且您返回到命令行上下文时,将为每个事件的 SETLOCAL 发出一个隐式的 ENDLOCAL。无需显式发出 ENDLOCAL。
此外,如果您的脚本(或例程)被调用,那么当 CALL 完成时,在被调用的例程中发出的每个事件 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
关于windows - 每次批处理脚本运行后如何清除变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13727125/