我正在尝试制作一个简单的统计程序,它只计算运行次数。当我将跟踪文件的时间结果变量回显到大于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 ..
)
答案 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
有关详细信息,请在此论坛中寻求“延迟扩展”;关于这个话题有很多答案,比如这个:
答案 3 :(得分:0)
您使用单>
即:echo "Bla" > file.xyz
单>
只会覆盖文件中的任何内容
尝试>>
echo "Blabla" >> file.xyz
double >>
在文件末尾添加内容
答案 4 :(得分:0)
>>
代替>
进行重定向(追加模式)。答案 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 ..
)