更新批处理文件中的变量

时间:2015-02-18 13:58:24

标签: batch-file

我已经对这个主题进行了一些研究,但是我尝试的一切都没有正常工作。我只想为我的批处理文件的某些方面添加一个计数器。 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,当前的问题是它之后没有保存该变量。

3 个答案:

答案 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都会重定向到该文件。