使用批处理文件替换文件中的值与下一个字符匹配

时间:2018-03-19 10:39:17

标签: batch-file

我需要使用给定的变量名和值来修改类文件中的值。我需要修改两个字符之间的值。

ex file content:

public boolean ISDEV = false;

批处理脚本的示例部分:

set "searchstring=%1"
 set "valuestring=%2"
 set "textFile=Input.txt"

 FOR /f "delims=" %%i in ('type "%textFile%"') do (
 set "line=%%i"
  >>"%textFile%" !line:%searchstring%=%valuestring%!
 )

以上脚本将直接用于使用valuestring替换搜索字符串,我的要求是将ISDEV的值更改为true。 例如public boolean ISDEV = true;

我的计划是在将文本从下一个变量名称(ISDEV) = 开始到;

之后修改变量的值

任何人都可以告诉我如何从=到找到字符;替换新值。

1 个答案:

答案 0 :(得分:2)

此批处理代码适用于示例切换为ISDEVfalsetrue或值truefalse

@echo off
if "%~1" == "" goto :EOF
if not exist Input.txt goto :EOF

setlocal EnableExtensions EnableDelayedExpansion
set "SearchString=%~1"
set "TextFile=Input.txt"
set "TempFile=%TEMP%\%~n0.tmp"
del "%TempFile%" 2>nul

for /F "usebackq delims=" %%I in ("%TextFile%") do (
    set "Line=%%I"
    if not "!Line:%SearchString%=!" == "!Line!" (
        for /F "tokens=2 delims=;=" %%J in ("!Line!") do (
            for /F %%V in ("%%~J") do set "Value=%%V"
        )
        if "!Value!" == "false" (
            set "Line=!Line:false=true!"
        ) else if "!Value!" == "true" (
            set "Line=!Line:true=false!"
        )
    )
    echo !Line!>>"%TempFile%"
)
move /Y "%TempFile%" "%TextFile%" >nul 2>&1
if errorlevel 1 del "%TempFile%"
endlocal

但批处理文件解决方案对于此任务通常是个坏主意。 Windows 命令行解释程序不适用于文本文件中的字符串更改。它旨在执行命令和应用程序。有许多脚本解释器可以更好地更改文本文件,如VBScript,JScript,PowerShell,Python,Perl,......

上面的批处理文件从文件Input.txt读取不以分号开头的每个非空行,并将其分配给环境变量Line,其中两个感叹号之间的所有内容都包含!或来自由于启用了延迟环境变量扩展,因此在命令行set "Line=%%I"上删除了到行尾的感叹号。换句话说,此批处理文件不能用于处理包含空行的文本文件,以;开头的行和包含一个或多个!的行。

IF 条件检查该行是否包含通过参数1传递给批处理文件的搜索字符串,方法是将该行与所有出现的搜索字符串替换为不区分大小写的空字符串与未修改的字符串线。如果该行至少包含一次搜索字符串,则两个比较的字符串不相等。

如果行确实包含ISDEV,则在首次出现等号或分号为循环变量J的分号后,再使用一个 FOR 来获取字符串

第三个 FOR 循环用于删除从文件读取的值周围的所有空格/制表符。

如果剩余值区分大小写为falsetrue,则执行相应的字符串替换以将false行中的所有true不区分大小写替换为truefalse所有@echo off if "%~1" == "" goto :EOF if "%~2" == "" goto :EOF if not exist Input.txt goto :EOF setlocal EnableExtensions DisableDelayedExpansion set "SearchString=%~1" set "NewValue=%~2" set "TextFile=Input.txt" set "TempFile=%TEMP%\%~n0.tmp" del "%TempFile%" 2>nul for /F "usebackq delims=" %%I in ("%TextFile%") do ( set "Line=%%I" call :ProcessLine ) move /Y "%TempFile%" "%TextFile%" >nul 2>&1 if errorlevel 1 del "%TempFile%" endlocal rem Avoid a fall through to subroutine below. goto :EOF :ProcessLine setlocal EnableDelayedExpansion if "!Line:%SearchString%=!" == "!Line!" goto OutputLine for /F "tokens=2 delims=;=" %%J in ("!Line!") do ( for /F %%V in ("%%~J") do set "OldValue=%%V" ) set "Line=!Line:%OldValue%=%NewValue%!" :OutputLine echo !Line!>>"%TempFile%" endlocal goto :EOF

输出未修改或修改的行,并将此输出重定向到临时文件中,该文件最终在输入文件上移动。

这是另一个批处理文件,如上所述要慢得多。它将当前值替换为指定为第二个参数的字符串。它处理包含正确感叹号的行。

;

但是这个批处理文件也会跳过所有以;开头的空行和行。

此第三个批处理文件保留以@echo off if "%~1" == "" goto :EOF if "%~2" == "" goto :EOF if not exist Input.txt goto :EOF setlocal EnableExtensions DisableDelayedExpansion set "SearchString=%~1" set "NewValue=%~2" set "TextFile=Input.txt" set "TempFile=%TEMP%\%~n0.tmp" del "%TempFile%" 2>nul for /F "tokens=1* delims=:" %%I in ('%SystemRoot%\System32\findstr.exe /R /N /C:"^" "%TextFile%" 2^>nul') do ( set "Line=%%J" if not defined Line echo/>>"%TempFile%" if defined Line call :ProcessLine ) move /Y "%TempFile%" "%TextFile%" >nul 2>&1 if errorlevel 1 del "%TempFile%" endlocal rem Avoid a fall through to subroutine below. goto :EOF :ProcessLine setlocal EnableDelayedExpansion if "!Line:%SearchString%=!" == "!Line!" goto OutputLine for /F "tokens=2 delims=;=" %%K in ("!Line!") do ( for /F %%V in ("%%~K") do set "OldValue=%%V" ) set "Line=!Line:%OldValue%=%NewValue%!" :OutputLine echo !Line!>>"%TempFile%" endlocal goto :EOF 开头的空行和行。

:

但是以一个或多个Input.txt开头的行在修改后的@echo off if "%~1" == "" goto :EOF if "%~2" == "" goto :EOF if not exist Input.txt goto :EOF call "%~dp0jrepl.bat" "(%~1[ \t]*=[ \t]*)[^;]+" "$1%~2" /F "Input.txt" /O - 中,而在行的开头没有冒号。

最后让我们看一下使用正确的脚本语言,文本文件中的字符串替换是多么容易,例如安装了Windows的JScript,它支持正则表达式替换。

我们正在使用 Dave Benham 编写的JREPL.BAT,这是一个批处理文件/ JScript混合,使用与下面的批处理文件存储在同一目录中的JScript在文件上运行正则表达式替换

cscript.exe

当然可以使用wscript.exepowershell.exe以及相应的脚本文件或call /?以及相应的PowerShell脚本执行整个任务。

要了解使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完全阅读为每个命令显示的所有帮助页面。

  • %~n0 ...解释del /?(没有路径和扩展名的批处理文件的名称)
  • echo /?
  • endlocal /?
  • findstr /?
  • for /?
  • goto /?
  • if /?
  • move /?
  • rem /?
  • set /?
  • setlocal /?
  • jrepl.bat /? | more
  • {{1}}

另请阅读有关Using Command Redirection Operators的Microsoft文章,并在Where does GOTO :EOF return to?

上回答