batch-file - 将变量回显到文件中

标签 batch-file cmd

我正在尝试制作一个简单的统计程序,它只是计算它运行的次数。当我将大于 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/

相关文章:

windows - 如何使用批处理文件清除 json 中的字段?

mysql - 如何使批处理文件将 sql 查询写入包含 < 的文件而不转储结果

batch-file - 用于监视 FTP 服务器上更改的批处理脚本

windows - 在 Windows 批处理文件中打开网页

windows - TFS Git 存储库在 Windows 命令提示符下不断询问凭据

windows - 如何使用 cmd 在最小化窗口中启动 Windows 10 应用程序?

batch-file - 在dos下使用通配符删除目录

regex - 混合 FOR 和 FINDSTR 时出现荒谬的插入符转义序列

macros - Word 2010/m 从批处理文件切换

windows - 批处理文件中的 VC++ SetEnv.cmd