我有以下代码片段,它将变量输出到文本文件中。
%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等,因此只需上传提取。
答案 0 :(得分:2)
你的endlocal结束了延迟扩展,这意味着你无法使用!后来的变量了。尝试简单地使用
echo Done: %drone% Files deleted: %counter% >> clearTempFilesonDrones.txt
请注意,之后可以使用常规!temp!
访问代码块中首次使用%temp%
访问的变量
如果这不起作用,我建议您尝试删除endlocal
,或将其放在最后一个回声下方的一行中。
答案 1 :(得分:1)
看起来setlocal
的行为没有或有1或2个可选的4个参数,endlocal
并不是您真正知道的。
查看
上的答案其中详细介绍了setlocal
和endlocal
的实际内容。
环境变量drone
和counter
的当前值必须从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 /?
内置帮助并不像引用的答案那么详细,但应该阅读。