首页 文章

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

提问于
浏览
1

我有一个名为 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

    我建议为此任务执行以下代码:

    @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 /?

相关问题