Использование пакетного сценария DOS: найдите строку в файле свойств и замените текст - PullRequest
1 голос
/ 22 сентября 2011

Попытка заменить строку в файле свойств на определенной строке с помощью командного файла. Я знаю, что это можно сделать БЕЗ использования временного файла, как я уже видел, но забыл, как это сделать.

Я знаю, что если у меня есть файл var.properties, который содержит это:

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

Я пытаюсь обновить значение CLASSPATH в файле .properties без изменения порядка файла свойств.

Это файл свойств, поэтому я считаю, что ответ будет связан с использованием:

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

Ответы [ 2 ]

2 голосов
/ 22 сентября 2011

Вместо findstr используйте find с переключателями /v и /i на "classpath". Это пропустит строку, возвращающую classpath, и вы сможете отобразить то, что вы хотите в файле, с помощью 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%"
)

EDIT:

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", она вставит новую строку, которой вы хотели заменить ее, а все остальное останется прежним.
0 голосов
/ 22 сентября 2011

Я, наконец, сломался и принял метод, используя временный файл. Использование отложенного расширения с '!' персонаж решил мой вопрос. Во многом этот успех произошел благодаря вкладу 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
...