我需要使用给定的变量名和值来修改类文件中的值。我需要修改两个字符之间的值。
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) = 开始到;
之后修改变量的值任何人都可以告诉我如何从=到找到字符;替换新值。
答案 0 :(得分:2)
此批处理代码适用于示例切换为ISDEV
值false
至true
或值true
至false
。
@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 循环用于删除从文件读取的值周围的所有空格/制表符。
如果剩余值区分大小写为false
或true
,则执行相应的字符串替换以将false
行中的所有true
不区分大小写替换为true
或false
所有@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.exe
或powershell.exe
以及相应的脚本文件或call /?
以及相应的PowerShell脚本执行整个任务。
要了解使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完全阅读为每个命令显示的所有帮助页面。
%~n0
...解释del /?
(没有路径和扩展名的批处理文件的名称)echo /?
endlocal /?
findstr /?
for /?
goto /?
if /?
move /?
rem /?
set /?
setlocal /?
jrepl.bat /? | more
另请阅读有关Using Command Redirection Operators的Microsoft文章,并在Where does GOTO :EOF return to?
上回答