windows - 每次批处理脚本运行后如何清除变量?

标签 windows cmd batch-file

似乎因为我在批处理脚本中使用 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/

相关文章:

windows - 将退出代码从 exec 的批处理文件传播回 ant

batch-file - 您可以创建一个在批处理文件中包含变量的变量吗?

java - 为什么 Java 的 `.dateLastModified` 在某些 Windows 7 文件中会被截断?

windows - Windows 在哪里存储计划任务控制台的设置?

windows - 如何在 Windows 批处理脚本中将 STDIN、STDOUT、STDERR 重定向到文件

windows - 为什么 "Content-Length: 0"在 POST 请求中?

video - 我的视频文件大小不等于比特率 x 时间

c# - 打开命令行并在不关闭的情况下读取输出

batch-file - Windows 批处理——保存文件名列表,不包括列表文件本身

node.js - 在bat文件中查询npm错误状态