ttb*_*ack 15 windows cmd batch-file
似乎因为我使用SET在批处理脚本中声明我的变量,如果我在cmd中多次运行它,变量值将保持不变,除非我明确地重置它们.
我是否必须使用setlocal和endlocal来确保一次运行中的变量不会持久化到另一次运行而不关闭CMD?
dbe*_*ham 18
是的,你应该使用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
Run Code Online (Sandbox Code Playgroud)
输出:
var=pre-CALL value
var=within CALL value
var=pre-CALL value
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
结果:
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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
27636 次 |
| 最近记录: |