2

我正在尝试制作一个简单的统计程序,它只计算它运行了多少次。当我将时间结果变量回显到大于 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 ..
)
4

6 回答 6

2

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

您可以通过使用 启用延迟扩展setlocal enableDelayedExpansion,然后使用!uses!而不是%uses%. help set从命令提示符键入以获取更多信息。从“最后,添加了对延迟环境变量扩展的支持......”开始的段落开始阅读,大约在帮助进行到一半的时候。

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

您目前正在避免另一个问题,但您应该注意:1>filename>filename做同样的事情 - 它们是将标准输出(stdout)重定向到文件的指令。1 是标准输出的 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%
于 2012-12-28T05:36:26.800 回答
1

您的问题与延迟变量扩展直接相关。要解决它,请在程序的开头插入这一行:

setlocal EnableDelayedExpansion

并将在 IF 块中修改的变量用感叹号而不是百分比括起来:

echo !uses! > %username%-use_tracking

更多详情,请在本论坛中搜索“延迟扩展”;关于这个话题有很多答案,比如这个:

在for语句中将变量设置为另一个变量

于 2012-12-28T05:30:06.893 回答
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_trackingecho %uses% > %username%-use_tracking(注意 double >>)。一种>表示覆盖,两种表示附加到当前内容的末尾。

于 2012-12-28T02:36:34.950 回答
0

你用单>

IE。:echo "Bla" > file.xyz

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

尝试>>

echo "Blabla" >> file.xyz

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

于 2012-12-28T02:29:40.810 回答
0

好的,我已经意识到 for 命令以一种奇怪的方式影响变量,我必须使用延迟扩展。感谢大家陈述这些。我已经设法让它正常工作,正是我想要的,这里是:

@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 ..
)
于 2012-12-28T14:22:46.227 回答
0
  1. 使用>>而不是>重定向(附加模式)。
  2. 如果要更改其间的目录,请使用日志文件的绝对路径,而不是相对路径。
于 2012-12-28T06:34:47.923 回答