Как обновить строку в существующем текстовом файле, содержащем определенную строку? - PullRequest
0 голосов
/ 09 декабря 2018

У меня есть текстовый файл с именем 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 голосов
/ 09 декабря 2018

Я предлагаю следующий код для этой задачи:

@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.

second IF аналогичен first IF , чтобы выяснить, содержит ли строка уже пользователя, переданного в пакетный файл в качестве первого аргумента.Пользователь добавляется только в строку в строке, которая еще не содержит этого пользователя.

Наконец, выполняется сравнение двоичного файла для текущего файла и нового файла.Только если два файла не имеют двоичного равенства, новый файл перемещается поверх исходного файла.В противном случае новый файл, являющийся двоичным, равным исходному файлу, просто удаляетсяПоэтому дата последнего изменения исходного файла изменяется только в том случае, если содержимое файла действительно изменилось.

Обратите внимание, что этот пакетный код не работает для текстовых файлов, содержащих пустые строки, строки с одним или несколькими восклицательными знаками,или строки, начинающиеся с точки с запятой.

Чтобы понять используемые команды и то, как они работают, откройте окно командной строки, выполните там следующие команды и полностью прочитайте все страницы справки, отображаемые для каждой команды.

  • del /?
  • echo /?
  • endlocal /?
  • fc /?
  • for /?
  • if /?
  • move /?
  • set /?
  • setlocal /?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...