看来,由于我使用SET在批处理脚本中声明我的变量,如果我在cmd中运行多次,变量值将会持续,除非我明确地重置它们.
我必须使用setlocal和endlocal来确保一个运行中的变量不会持续到另一个运行,而不关闭CMD吗?
是的,你应该使用SETLOCAL.这将使本地化任何更改,以便在发出ENDLOCAL后旧的环境将被恢复.
当所有脚本处理完成并返回到命令行上下文时,会为每个活动的SETLOCAL发出一个隐式ENDLOCAL.没有必要明确地发出ENDLOCAL.
此外,如果您的脚本(或例程)被调用,那么当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