使用DOS批处理脚本:在属性文件中查找一行并替换文本

时间:2011-09-22 16:54:14

标签: string batch-file replace dos

尝试使用批处理文件替换特定行上的属性文件中的字符串。我知道这可以在没有使用临时文件的情况下完成,正如我之前看到的那样,但是忘记了如何去做。

我知道如果我有一个包含这个的var.properties文件:

CLASSPATH=bsh.jar;other.jar
VARTEST=dummy
ANOTHERVAR=default

我正在尝试更新.properties文件中的CLASSPATH值,而不更改属性文件的顺序。

这是一个属性文件,因此我认为答案与使用相关:

for /f "tokens=1,2* delims==" %%i in (var.properties) do (
  @echo Key=%%i Val=%%j
)

2 个答案:

答案 0 :(得分:2)

而不是findstr使用find在“classpath”上使用/v/i开关。这将OMIT返回包含类路径的行,然后您可以在文件中回显您想要的内容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_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
)

基本上是状态,

  1. 将think.properties重命名为OLD_think.properties
  2. 读取OLD_think.properties并找到包含字符串的行号 其中有“classpath”并将其设置为变量LINE
  3. 查找OLD_think.properties中的所有行,并将它们回显到think.properties中。一旦到达存在“CLASSPATH”字符串的行,它就会插入您要替换它的新行,其他所有内容保持不变。

答案 1 :(得分:0)

我终于崩溃并接受了一个使用“临时”文件的方法。使用'!'延迟扩展性格解决了我的问题。大部分成功归功于mecaflash的投入。

您可以使用以下命令调用此脚本: CALL Script.bat PropKey NewPropValue文件名

@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