将变量回送到文件中

时间:2012-12-28 02:21:21

标签: 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 ..
)

6 个答案:

答案 0 :(得分:2)

当文件已存在时,您的代码失败,因为您正在设置变量值,然后在同一个带括号的代码块中访问该值;解析行时会扩展%uses%,并且会立即解析整个代码块。因此,您回显的值是执行FOR循环之前存在的值 - 而不是您想要的值。

您可以使用setlocal enableDelayedExpansion启用延迟展开,然后使用!uses!代替%uses%来解决问题。从命令提示符处键入help set以获取更多信息。开始阅读以开头的段落“最后,添加了对延迟环境变量扩展的支持......”大约在帮助的一半。

但是有一种更简单的方法可以避免延迟扩展的需要。您只需要在IF块中设置该值。您可以稍后在IF块之外访问它。

您目前还在避免另外一个问题,但您应该注意:1>filename>filename执行相同的操作 - 它们是将标准输出(stdout)重定向到a的指令文件。 1是stdout的id,当没有明确给出数字时,它是默认值。 2>filename将标准错误(stderr)重定向到文件。您正在避免将数字解释为流ID,因为数字和>之间有一个空格。但如果你不小心,你总有一天会没有空间,并且为什么数字不打印而感到困惑。您可以通过将重定向放在前面而不是最后来避免此问题。 >filename 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%

答案 1 :(得分:1)

测试当前文件(只需删除顶部创建文件夹的块,以便输出到我当前的目录,两条cd ..行,并在顶部添加set username=ken生产:

  • 第一次使用正确的内容(单行1
  • 第二次单行ECHO is on的文件。
  • 第三次出现错误消息。

您正在获取该输出,因为ECHO已启用,第二次运行是ECHO该设置第二次运行批处理文件。

您需要在批处理文件的顶部关闭echo。 (这不会阻止使用echo命令;它只会阻止输出批处理文件本身。)

这对我有用(进行上面提到的更改):

@echo off
set username=ken

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
)

if not exist %username%-use_tracking (
echo 1 > %username%-use_tracking
)

结果是:

  • 第一次使用正确的内容(单行1
  • 第二次单行2的文件。
  • 第三次使用单行3的文件。 (以及更多的运行等等。)

如果您想要保留文件中的每一行,请将第一个echo %uses% > %username%-use_tracking更改为echo %uses% > %username%-use_tracking(请注意双>>)。一个>表示覆盖,两个表示附加到当前内容的末尾。

答案 2 :(得分:1)

您的问题与延迟变量扩展直接相关。要解决此问题,请在程序的beginnng处插入以下行:

setlocal EnableDelayedExpansion

并在感叹号中包含在IF块内修改的变量而不是百分比:

echo !uses! > %username%-use_tracking

有关详细信息,请在此论坛中寻求“延迟扩展”;关于这个话题有很多答案,比如这个:

Set the variable to another variable in the for statement

答案 3 :(得分:0)

您使用单>

即:echo "Bla" > file.xyz

>只会覆盖文件中的任何内容

尝试>>

echo "Blabla" >> file.xyz

double >>在文件末尾添加内容

答案 4 :(得分:0)

  1. 使用>>代替>进行重定向(追加模式)。
  2. 如果要更改其间的目录,请使用日志文件的绝对路径,而不是相对路径。

答案 5 :(得分:0)

好吧,我已经意识到命令会以奇怪的方式影响变量,我必须使用延迟扩展。谢谢大家说明这些。我已经设法让它正常工作,我想要的确切方式如下:

@echo off
setlocal EnableDelayedExpansion

if not exist statistic_files (
mkdir statistic_files
cd statistic_files
goto skip
)
cd statistic_files
:skip
set "file=%username%-use_tracking"
set "uses=1"

if not exist %file% (
>%file% echo 1
cd ..
)
if exist %file% (
for /f %%G IN (%file%) do set /A uses=%%G+1
>%file% echo !uses!
cd ..
)