如何更新现有文本文件中包含特定字符串的行?

时间:2018-12-09 11:32:19

标签: batch-file

我有一个名为Test.OPT的文本文件,其内容如下:

REPORTLOG +"E:\LicenseLogs\cstd.rl"
GROUPCASEINSENSITIVE ON
GROUP TEST_USERS user1 user2
INCLUDE feature1 TEST_USERS 
INCLUDE feature2 TEST_USERS  
INCLUDE Solver_feature3 TEST_USERS  
INCLUDE Solver_feature4 TEST_USERS  
INCLUDE Solver_feature5 TEST_USERS  
INCLUDE Solver_feature6 TEST_USERS
INCLUDE Solver_feature7 TEST_USERS 

我想在上述文本文件中的包含GROUP TEST_USERS字符串User3的行的末尾追加。

下面有一个无法按预期方式运行的批处理文件:

@echo off
setlocal EnableDelayedExpansion

set search=%1
set "textfile=D:\testing\Test.OPT"
set "newfile=D:\testing\TestTemp.OPT"

(for /f "delims=" %%i in (%textfile%) do (
    set "line=%%i"

    findStr /B /c:"GROUP TEST_USERS" %%i>nul && (
        set line=%%i %search%
    ) || (
        set "line=%%i"
    )
    echo(!line!
    endlocal
))>"%newfile%"

我可以在Java中轻松完成此操作,但是由于某些原因,我不得不使用批处理脚本来完成此操作。

1 个答案:

答案 0 :(得分:1)

对于此任务,我建议使用以下代码:

@echo off
setlocal EnableExtensions EnableDelayedExpansion
set "search=%~1"
set "textfile=D:\testing\Test.OPT"
set "newfile=D:\testing\TestTemp.OPT"

(for /F "usebackq delims=" %%i in ("%textfile%") do (
    set "line=%%i"
    if not "!line:GROUP TEST_USERS=!" == "!line!" (
        set "UserCheck=!line! "
        if "!UserCheck: %search% =!" == "!UserCheck!" set "line=!line! %search%"
    )
    echo(!line!
))>"%newfile%"

%SystemRoot%\System32\fc.exe /B "%textfile%" "%newfile%" >nul
if errorlevel 1 move /Y "%newfile%" "%textfile%" 2>nul
if exist "%newfile%" del "%newfile%"
endlocal

第一个 IF 条件将区分大小写的行与所有出现的GROUP TEST_USERS替换为不区分大小写的行替换为当前行的空字符串。如果两个比较的字符串不相等,则当前行包含GROUP TEST_USERS

在包含GROUP TEST_USERS的行上,该行被分配了一个尾随空格,用于环境变量UserCheck

第二个 IF 与第一个 IF 相似,以找出该行是否已经包含作为第一个参数传递给批处理文件的用户。该用户仅追加到尚未包含该用户的行上。

最后,对当前文件和新文件执行二进制文件比较。仅当两个文件的二进制数不相等时,新文件才移到原始文件上。否则,将删除二进制等于原始文件的新文件。因此,仅当文件内容也确实发生更改时,原始文件的最后修改日期才会更改。

请注意,此批处理代码不适用于包含空行,带有一个或多个感叹号的行或以分号开头的行的文本文件。

要了解所使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并非常仔细地阅读每个命令显示的所有帮助页面。

  • del /?
  • echo /?
  • endlocal /?
  • fc /?
  • for /?
  • if /?
  • move /?
  • set /?
  • setlocal /?