如何在每次批处理运行后清除变量?

19

看起来由于我在批处理脚本中使用SET声明变量,如果我在CMD中多次运行它,则变量值将持久存在,除非我明确重置它们。

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

1个回答

21

是的,您应该使用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

在调用的子例程中使用ENDLOCAL将无法回滚在调用之前发出的SETLOCAL。比如说:

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

2
我明白了...所以基本上每个setlocal之后的SET操作都会在执行完成后被清除。我会试一下的。这比我自己清除变量要方便得多。 - ttback

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接