String 使用DOS批处理脚本:在属性文件中查找一行并替换文本
尝试使用批处理文件替换某行属性文件中的字符串。我知道这不需要使用临时文件就可以做到,就像我以前看到的那样,但我忘记了如何做到这一点 我知道如果我有一个var.properties文件包含以下内容:String 使用DOS批处理脚本:在属性文件中查找一行并替换文本,string,batch-file,replace,dos,String,Batch File,Replace,Dos,尝试使用批处理文件替换某行属性文件中的字符串。我知道这不需要使用临时文件就可以做到,就像我以前看到的那样,但我忘记了如何做到这一点 我知道如果我有一个var.properties文件包含以下内容: CLASSPATH=bsh.jar;other.jar VARTEST=dummy ANOTHERVAR=default 我正在尝试更新.properties文件中的类路径值,而不更改属性文件的顺序 这是一个属性文件,因此我相信答案与使用: for /f "tokens=1,2* delims=="
CLASSPATH=bsh.jar;other.jar
VARTEST=dummy
ANOTHERVAR=default
我正在尝试更新.properties文件中的类路径值,而不更改属性文件的顺序
这是一个属性文件,因此我相信答案与使用:
for /f "tokens=1,2* delims==" %%i in (var.properties) do (
@echo Key=%%i Val=%%j
)
用
/v
和/i
开关打开“类路径”,而不是findstr
使用find
。这将省略返回包含类路径的行,然后您可以在文件中沿w/VARTEST=dummy
SET NEWVAL=CLASSPATH=test.jar
SET FILE=think.properties
FOR /F "USEBACKQ tokens=*" %%A IN (`TYPE "%FILE%" ^|FIND /V /I "classpath"`) DO (
ECHO CLASSPATH=%NEWVAL%>>"%FILE%"
ECHO %%A>>"%FILE%"
)
编辑:
SETLOCAL ENABLEDELAYEDEXPANSION
SET NEWVAL=test.jar
SET OLDFILE=OLD\u think.properties
SET NEWFILE=think.properties
设置计数=1
移动“%NEWFILE%”%OLDFILE%
对于(`TYPE“%OLDFILE%”中的/F“USEBACKQ tokens=*”%%A^ | FIND/C/I“classpath”`)DO(
设置行=%%A
)
对于(`FIND/V”“^>%NEWFILE%”)中的/F“USEBACKQ令牌=*”%%A,其他(ECHO%NEWVAL%%>%NEWFILE%”)命令
设置/a计数=!伯爵+1.
)
基本上说,
我最终崩溃了,接受了一个使用“temp”文件的方法。使用带“!”的延迟扩展性格解决了我的问题。这一成功在很大程度上归功于政府的投入 可以使用以下命令调用此脚本:call script.bat PropKey NewPropValue Filename
@echo关闭
::用于更新属性文件的脚本
setLocalEnableExtensions
SETLOCAL EnableDelayedExpansion
如果“%3”=“”(
ECHO脚本将选择性地接受3个参数:PropKey PropVal文件
设置PROPKEY=UseCompression
设置PROPVAL=false
SET FILE=config.properties
)否则(
设置PROPKEY=%1
设置PROPVAL=%2
设置文件=%3
)
FINDSTR/B%PROPKEY%%FILE%>nul
如果%ERRORLEVEL%EQU 1转到nowork
移动/Y“%FILE%”%FILE%.bak
对于(`TYPE“%FILE%.bak”^ | FIND/N/I“%PROPKEY%”中的/F“USEBACKQ令牌=*”%%A,请执行以下操作(
设置行=%%A
)
对于/F“tokens=1,2*delims=]”%%S in(“%LINE%”)DO SET LINE=%%S
设置/A行=%LINE:~1,6%
设置/A计数=1
对于(`FIND/V”“^>%FILE%”中的/F“USEBACKQ令牌=*”%%A
)否则(
回显%PROPKEY%=%PROPVAL%>>%FILE%
ECHO更新了%FILE%,值为%PROPKEY%=%PROPVAL%
)
设置/A计数+=1
)
转到终点
:不工作
echo在%文件%中找不到匹配的字符串%PROPKEY%。没有工作要做。
暂停
:结束
我明白了。那么我不确定你能做什么。在编辑文件中的字符/字符串时,批处理/DOS脚本是垃圾,特别是当您需要特定于字符或行时。我知道他们有用于基于linux的CLI文件编辑的资源工具包(如awk)。但不确定这是否是您愿意做的。如果只有特殊的行尾字符,可能有一种可能的方法来做到这一点。哦。。。我的错误给了我一种亲切的感觉。。。编辑我的帖子等待一分钟=进行额外编辑。忘了在IF语句中用%LINE%替换3我终于找到了答案。请参阅我对这个问题的回答。据我所知,您希望读取var.properties文件,然后(有选择地)写入该文件。我想不出一种不用创建另一个文件就可以完成的方法。这个脚本工作正常,但我发现了一个问题。它正在从文件中删除所有空白行。你知道如何保持空白行的完整性吗?是的,有办法,但很奇怪。我想你会在这里找到秘密(如果我没记错的话):
SETLOCAL ENABLEDELAYEDEXPANSION
SET NEWVAL=test.jar
SET OLDFILE=OLD_think.properties
SET NEWFILE=think.properties
SET COUNT=1
MOVE "%NEWFILE%" "%OLDFILE%"
FOR /F "USEBACKQ tokens=*" %%A IN (`TYPE "%OLDFILE%" ^|FIND /C /I "classpath"`) DO (
SET LINE=%%A
)
FOR /F "USEBACKQ tokens=*" %%A IN (`FIND /V "" ^<"%OLDFILE%"`) DO (
IF %COUNT% NEQ %LINE% (ECHO %%A>>"%NEWFILE%") ELSE (ECHO %NEWVAL%>>"%NEWFILE%")
SET /a COUNT=!COUNT!+1
)
@echo off
:: script for updating property files
SETLOCAL EnableExtensions
SETLOCAL EnableDelayedExpansion
if "%3"=="" (
ECHO Script will optionally accept 3 args: PropKey PropVal File
SET PROPKEY=UseCompression
SET PROPVAL=false
SET FILE=config.properties
) ELSE (
SET PROPKEY=%1
SET PROPVAL=%2
SET FILE=%3
)
FINDSTR /B %PROPKEY% %FILE% >nul
IF %ERRORLEVEL% EQU 1 GOTO nowork
MOVE /Y "%FILE%" "%FILE%.bak"
FOR /F "USEBACKQ tokens=*" %%A IN (`TYPE "%FILE%.bak" ^|FIND /N /I "%PROPKEY%"`) DO (
SET LINE=%%A
)
FOR /F "tokens=1,2* delims=]" %%S in ("%LINE%") DO SET LINE=%%S
SET /A LINE=%LINE:~1,6%
SET /A COUNT=1
FOR /F "USEBACKQ tokens=*" %%A IN (`FIND /V "" ^<"%FILE%.bak"`) DO (
IF "!COUNT!" NEQ "%LINE%" (
ECHO %%A>>"%FILE%"
) ELSE (
ECHO %PROPKEY%=%PROPVAL%>>"%FILE%"
ECHO Updated %FILE% with value %PROPKEY%=%PROPVAL%
)
SET /A COUNT+=1
)
GOTO end
:nowork
echo Didn't find matching string %PROPKEY% in %FILE%. No work to do.
pause
:end