我已经对这个主题进行了一些研究,但是我尝试的一切都没有正常工作。我只想为我的批处理文件的某些方面添加一个计数器。 count.txt文件包含:
Counters started on 2-18-15
opened: 0
actions: 0
到目前为止我写的脚本是:
setlocal enabledelayedexpansion
for /F "usebackq tokens=2" %%r in (`findstr opened: counter.txt`) do (
echo %%r
set opened=%%r
set /a opened=!opened!+1
echo opened= !opened!
)
我想编辑已打开的次数,而不是更改文件中的任何其他内容。我知道这是记忆,但我的批处理能力仍然非常有用。
我指定了!代替%,使用一些调试它正在拉动正确的变量并向其添加1,当前的问题是它之后没有保存该变量。
答案 0 :(得分:0)
您需要使用延迟扩展来正确显示代码块内设置的变量。
setlocal enabledelayedexpansion
for /F "usebackq tokens=2" %%r in (`findstr /C:"opened:" counter.txt`) do (
set opened=%%r
set /a opened=!opened!+1
echo opened=!opened!
)
答案 1 :(得分:0)
您永远不会将信息写回文件 - 您只是将值回显到屏幕上。
批处理没有直接修改文件中值的机制。您必须使用更新的信息编写新文件,然后用新文件替换旧文件。
假设行的顺序无关紧要,我会按如下方式编写批处理脚本:
@echo off
setlocal
for /f "tokens=2" %%N in ('findstr /bc:"opened: " counter.txt') do set /a opened=%%N+1
>counter.txt.new (
findstr /vbc:"opened: " counter.txt
echo opened: %opened%
)
move /y counter.txt.new counter.txt >nul
运行脚本一次后,您的counter.txt文件将如下所示:
Counters started on 2-18-15
actions: 0
opened: 1
您可能希望保留行的顺序。您可以使用纯批处理脚本执行此操作,但我很少使用批处理来修改文本文件。相反,我会使用我的JREPL.BAT utility - 它更快,更可靠,更简单(假设你理解正则表达式和基本的JScript)
call jrepl "^(opened:\s*)(\d+)$" "$1+(Number($2)+1)" /j /f test.txt /o -
答案 2 :(得分:0)
@ECHO OFF
SETLOCAL
(
for /F "delims=" %%a in (q28585447.txt) do (
for /F "tokens=1,2" %%q in ("%%a") do (
IF "%%q"=="opened:" (CALL :REPLACE %%r) ELSE (ECHO %%a)
)
)
)>newfile.txt
GOTO :EOF
:REPLACE
SET /a newvalue=%1+1
ECHO(opened: %newvalue%
GOTO :eof
我使用了一个名为q28585447.txt
的文件,其中包含我的测试数据。
生成newfile.txt要替换您的文件,请使用move /y newfile.txt q28585447.txt
(当然,在修改文件名之后。
简单地说,它会将数据文件中的每一行读取到%%a
,然后使用默认分隔符将%%a
标记为%%q
和%%r
如果%%q
是%%r
目标字符串,然后%%a
包含要递增的值,否则重新调整:replace
中的行。
子程序for...%%a
simlpy将1传递给传递的参数并重建目标线。
通过括起括号中的整个echo
循环并重定向到文件,所有输出{{1}} ed都会重定向到该文件。