我正在尝试编写一个Windows批处理文件,该文件将在文本文件中读取,其中包含某些文本并在该文件中增加一些值。
文本文件包含如下文字:
public static const COUNTER:int = 0
然后,批处理文件将搜索“COUNTER:int = 0
”并递增0值。
不幸的是,我对Windows批处理文件的知识不存在,所以对此事的任何建议或帮助表示赞赏!
谢谢!
答案 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”。