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

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=="

尝试使用批处理文件替换某行属性文件中的字符串。我知道这不需要使用临时文件就可以做到,就像我以前看到的那样,但我忘记了如何做到这一点

我知道如果我有一个var.properties文件包含以下内容:

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.
)
基本上说,

  • 将think.properties重命名为OLD_think.properties
  • 阅读OLD_think.properties并找到带有字符串的行号 “classpath”并将其设置为变量行
  • 在旧的_think.properties中找到所有行,并将它们回显到think.properties中。一旦到达“CLASSPATH”字符串所在的行,它就会插入您想要替换的新行,其他所有内容都保持不变

  • 我最终崩溃了,接受了一个使用“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