Windows批处理解析模板和增量值

时间:2009-10-16 08:11:15

标签: windows batch-file templates parsing

我正在尝试编写一个Windows批处理文件,该文件将在文本文件中读取,其中包含某些文本并在该文件中增加一些值。

文本文件包含如下文字:

public static const COUNTER:int = 0
然后,批处理文件将搜索“COUNTER:int = 0”并递增0值。

不幸的是,我对Windows批处理文件的知识不存在,所以对此事的任何建议或帮助表示赞赏!

谢谢!

2 个答案:

答案 0 :(得分:3)

我建议不要使用批处理文件来解析文件。它只是不能很好地处理这些事情。

如果您绝对确定您的文件永远不会包含以下字符:&|><"然后您可以使用批处理文件。但是,迎合这些角色很难,而且在某些情况下完全不可能。

在这种情况下,最好使用VBScript处理文件或使用各种UNIX工具执行该任务。这可以使用awk

请注意,Windows 7包含Windows PowerShell,其中此类任务非常简单。它可以在Windows XP及更高版本上单独安装。

但是,我想我会在这里使用VBScript解决方案。

如果您的要求符合上述限制,则可以使用批处理文件执行此操作。下面的那个应该可以工作。


首先,我们需要延迟扩展,因此这必须是批次中的第一行:

setlocal enableextensions enabledelayedexpansion

您可以使用for /f迭代文件中的行:

for /f "delims=" %%x in (my_file) do call :process "%%x"
goto :eof

:process
    ...
goto :eof

这将为文件的每一行调用子例程process,将该行作为参数移交。 delims=部分指定我们不希望在该行上进行标记。我们现在看看那个例程的内容。

Fist我们需要知道该行是否包含我们正在寻找的字符串(注意,循环变量,包含该行仅在循环内部的<{1}} ,in子程序变为%%x):

%1

在内部,现在echo %1 | findstr "COUNTER:int" >nul 2>&1 if not errorlevel 1 ( ... ) else ( echo %~1>>new_file ) ,我们可以处理该行,以防它包含搜索字符串。我们首先需要剖析它。最简单的方法是将其拆分为...字符,然后我们递增数字并再次输出所有内容。

=

所以,把它们放在一起,它看起来像这样:

for /f "tokens=1,2 delims==" %%a in (%1) do (
    set /a number=%%b+1
    echo %%a= !number!>>new_file
)

代码可在my SVN

中找到

答案 1 :(得分:0)

如果你有 sed ,你可以这样做:

sed "s/COUNTER:int *= *0/COUNTER = 1/" file.cs >newfile.cs

这假设您只是在寻找一个特定的常量名称,并希望将“0”更改为“1”。