批处理文件ENABLEDELAYEDEXPANSION不会写出变量

时间:2016-08-29 13:35:05

标签: loops batch-file cmd counter delayedvariableexpansion

我有以下代码片段,它将变量输出到文本文件中。 %drone%将是一个简单的文本字符串,%counter%是一个循环中的数字,用于计算迭代次数。

echo %drone% !counter!向屏幕显示正确的值,但在echo Done: %drone% Files deleted: !tempcounter! >> clearTempFilesonDrones.txt代码中,!tempcounter!变量在输出到文件时为空。

我已尝试将其设置为临时变量并使用%tempvariable%,但这并不起作用。我也试过"!counter!",因为它会认为这是一个字符串而不仅仅是一个数字,但也没有用。

echo %drone% %counter%
endlocal

echo Done: %drone% Files deleted: !counter! >> clearTempFilesonDrones.txt

有什么想法吗?

我无法将整个代码复制到当前客户端中阻止的pastebin等,因此只需上传提取。

2 个答案:

答案 0 :(得分:2)

你的endlocal结束了延迟扩展,这意味着你无法使用!后来的变量了。尝试简单地使用

echo Done: %drone% Files deleted: %counter% >> clearTempFilesonDrones.txt

请注意,之后可以使用常规!temp!访问代码块中首次使用%temp%访问的变量

如果这不起作用,我建议您尝试删除endlocal,或将其放在最后一个回声下方的一行中。

答案 1 :(得分:1)

看起来setlocal的行为没有或有1或2个可选的4个参数,endlocal并不是您真正知道的。

查看

上的答案

其中详细介绍了setlocalendlocal的实际内容。

环境变量dronecounter的当前值必须从endlocal删除的当前环境变量表传递到setlocal之前激活的已恢复环境变量表,并且在endlocal之后再次激活。

这可以按如下方式完成:

echo %drone% %counter%
endlocal & set "drone=%drone%" & set "counter=%counter%"

echo Done: %drone% Files deleted: %counter% >>clearTempFilesonDrones.txt

Windows命令处理器首先使用命令endlocal和两个set命令对整个命令行进行预处理,并使用当前环境变量的值导致用当前值替换变量引用。所以这条线是在预处理之后:

endlocal & set "drone=value of drone variable" & set "counter=counter value"

现在执行第一个endlocal,它会丢弃当前的环境变量表并恢复以前的环境变量表。然后执行两个set命令,将两个字符串分配给现在活动的环境变量表中的两个变量。

有关运营商&的说明,请参阅Single line with multiple commands using Windows batch file上的答案。

此外,我建议打开命令提示符窗口,执行以下命令,并完全阅读为每个命令显示的所有帮助页面。

  • endlocal /?
  • set /?
  • setlocal /?

内置帮助并不像引用的答案那么详细,但应该阅读。