我正在尝试制作一个简单的统计程序,它只是计算它运行的次数。当我将大于 1 的时间结果变量回显到跟踪文件时,就会出现问题。是否不可能将变量回显到文件上?我缺少什么? :/
if not exist statistic_files (
mkdir statistic_files
)
cd statistic_files
if exist %username%-use_tracking (
FOR /F %%G IN (%username%-use_tracking) DO set /A uses=%%G+1
:: THE PROBLEM IS BELOW
echo %uses% > %username%-use_tracking
cd ..
)
if not exist %username%-use_tracking (
echo 1 > %username%-use_tracking
cd ..
)
最佳答案
当文件已经存在时,您的代码会失败,因为您正在设置变量值,然后在同一括号内的代码块中访问该值; %uses%
在解析该行时展开,整个代码块一次性解析完毕。因此,您回显的值是执行 FOR 循环之前存在的值 - 不是您想要的值。
您可以通过使用 setlocal enableDelayedExpansion
启用延迟扩展来解决该问题,然后使用 !uses!
而不是 %uses%
。从命令提示符处键入 help set
以获取更多信息。从帮助的一半开始阅读“最后,添加了对延迟环境变量扩展的支持...”开始的段落。
但是有一种更简单的方法可以避免延迟扩展。您只需在 IF block 内设置值。您可以稍后在 IF block 之外访问它。
您当前正在避免另一个问题,但您应该注意:1>filename
和 >filename
执行相同的操作 - 它们是一条指令将标准输出 (stdout) 重定向到文件。 1 是 stdout 的 id,当没有明确给出数字时,它是默认值。 2>filename
将标准错误 (stderr) 重定向到文件。您避免将数字解释为流 ID,因为数字和 >
之间有空格。但如果您不小心,有一天您可能会没有空格,并且会困惑为什么不打印该数字。您可以通过将重定向放在前面而不是末尾来避免该问题。 >文件名 echo %uses%
这是一个完整的工作解决方案。
@echo off
setlocal
if not exist statistic_files mkdir statistic_files
cd statistic_files
set "file=%username%-use_tracking"
set "uses=1"
if exist %file% for /f %%G IN (%file%) do set /A uses=%%G+1
>%file% echo %uses%
关于batch-file - 将变量回显到文件中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14063793/