Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Замена текста между определенными символами

Ответить
Настройки темы
CMD/BAT - [решено] Замена текста между определенными символами

Новый участник


Сообщения: 9
Благодарности: 0

Профиль | Отправить PM | Цитировать


Добрый день!

Запускать на компах разрешено ТОЛЬКО *.bat файлы.
Есть файлик настроек XML содержащий 2 параметра, которые необходимо периодически менять.
1. Параметр находится между следующими символами ;KeyWord1=" и ";KeyWord2= (т.е. необходимо изменить значение KeyWord1)
2. Параметр находится между <Parametr> и </Parametr>

Вечерний серф по безкрайней паутине дал следующие результаты:
Код: Выделить весь код
@echo off

set folder=C:\test
set conf=test.xml
set NewKeyWord=NewKeyWord1

cd %folder%

setlocal enabledelayedexpansion

for /f "usebackq delims=" %%i in (%conf%) do (
	set LINE=%%i
rem не знаю как заменить значение KeyWord1 на NewKeyWord1
)

for /F "tokens=* delims=," %%n in (%conf%) do ( 
	set LINE=%%n 
	set LINE=!LINE:^<Parametr^>Enable^</Parametr^>=^<Parametr^>Disable^</Parametr^>!
	@echo !LINE!>>%temp%
)

endlocal
Помогите, пожалуйста, начинающему... Заранее спасибо.

Отправлено: 17:06, 24-04-2021

 

Ветеран


Сообщения: 1274
Благодарности: 564

Профиль | Отправить PM | Цитировать


Цитата localmaster:
а что дальше делать »
нужно перечитать все строки с поиском нужной и ее заменой и вывести в временный файл, а потом содержимым временного файла переписать исходный. И всю дорогу надо следить за спецсимволами. кодировками, концами строк, пустыми строками, форматированием.

Отправлено: 04:09, 27-04-2021 | #11



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Новый участник


Сообщения: 9
Благодарности: 0

Профиль | Отправить PM | Цитировать


Цитата:
нужно перечитать все строки с поиском нужной
Код: Выделить весь код
for /f "usebackq delims=^; tokens=2" %%a in (`findstr /rc:"KeyWord1"^=^.*^; %temp%`) do (
  set var=%%a
  echo !var!
)
Выводит единственное словосочетание KeyWord1="Key1!№%?*()-=+_"

Цитата:
и ее заменой и вывести в временный файл
Пока не понял как выцепить из этого "Key1!№%?*()-=+_" и заменить, с учетом того что в значении так же могут фигурировать знаки "="

Цитата:
а потом содержимым временного файла переписать исходный.
это знаю, можно использовать MOVE.

Последний раз редактировалось localmaster, 27-04-2021 в 15:27.


Отправлено: 14:56, 27-04-2021 | #12


Ветеран


Сообщения: 1274
Благодарности: 564

Профиль | Отправить PM | Цитировать


правильно, рано или поздно при дальнейших действиях на cmd или его обсуждениях в рамках данной задачи смысл уходит как вода через сито (скромно если, на самом деле быстрее)

Отправлено: 02:55, 28-04-2021 | #13


Новый участник


Сообщения: 9
Благодарности: 0

Профиль | Отправить PM | Цитировать


Вроде с поиском и заменой неизвестного ключа решение найдено.
Код: Выделить весь код
@echo off

setlocal enabledelayedexpansion

set conf=Config.xml
set temp=temp.xml
set kwd=NewKeyWord1

rem проверяю на наличие временного файла и если он есть - удаляю
if exist %temp% del /q /f %temp%


rem ищу необходимое словосочетание
for /f "usebackq delims=^; tokens=2" %%a in (`findstr /rc:"KeyWord1"^=^.*^; %conf%`) do (
  set var=%%a

rem из словосочетания забираю необходимый для замены ключ
  for /f "usebackq" %%s in (`cmd /v /c "echo !var:KeyWord1=!"`) do (
    set kwrd=%%s
  )
)

rem цикл записи всех строк во временный файл
for /f "tokens=*" %%q in (%conf%) do (
  set line=%%q

rem записываю все строки во временный файл и при нахождении ключа kwrd в какой-либо строке 
rem меняет его на ключ kwd
  echo !line:%kwrd%=%kwd%!>>%temp%
)

rem перезаписываем временный файл в конфигурационный файл
move /y %temp% %conf%

endlocal
exit /b
Вроде бы все правильно (переменные line и kwrd принимают правильные значения, переменная kwrd имеет уникальное значение), но по факту выполнения скрипта строка меняется на line:=KeyWord1=NewKeyWord1.

Намного упрощенный скрипт отработал на ура.
Код: Выделить весь код
@echo off

setlocal enabledelayedexpansion

set kwd=123
set kwrd=321
set var="bla=321"

set v=!var:%kwrd%=%kwd%!
echo %v%

endlocal
pause
exit /b
Где я допускаю ошибку?


Цитата alpap:
правильно, рано или поздно при дальнейших действиях на cmd или его обсуждениях в рамках данной задачи смысл уходит как вода через сито (скромно если, на самом деле быстрее) »
В связи с тем что я на данный момент только изучаю CMD и ее возможности, то на дне этого сита лежит хороший слой глины, который не пропускает смысл и знания. С момента начала работы над данной задачей узнал и, самое главное, понял как правильно строить логику работы с текстовыми файлами, то что использование, хотя бы, PS, не говоря уже о языках программирования (хотя бы Python), будет намного проще и удобнее.

Последний раз редактировалось localmaster, 28-04-2021 в 13:34.


Отправлено: 12:09, 28-04-2021 | #14


Ветеран


Сообщения: 1274
Благодарности: 564

Профиль | Отправить PM | Цитировать


Цитата localmaster:
Параметр находится между <Parametr> и </Parametr> »
странно как вы обходите <> при записи
хочется играться с cmd вот два примера, с поиском и заменой одной строки или сразу двух, разбирайтесь, помогать не буду, я уже отошел от того чтобы писать 20 строк на cmd там где достаточно 2-х, например на xml.exe
1

Код: Выделить весь код
@echo off
setlocal enabledelayedexpansion

set "f=file.xml" &: Файл в котором будет замена
set "sf=UserId" &: Поиск строки "<UserId>OFFICE\Admin</UserId>"
set "sz=%Computername%\%Username%" &: Здесь указать что вместо "OFFICE\Admin"

<"%f%">$ (for /f "delims=" %%A in ('more') do @echo "%%~A"|>nul find "%sf%" && (
  for /f "tokens=1-3 delims=<>" %%a in ("%%~A") do @set "z=%%b"& echo:^<%%a^>!z:%%b^=%sz%!^<%%c^>
 ) || (
  echo %%A
 )
)& >nul move $ "%f%"
exit

2

Код: Выделить весь код
@echo off
setlocal enabledelayedexpansion
set "sf1=<GoogleUsername>" &: Поиск строки "<GoogleUsername>username</GoogleUsername>"
set "sf2=<GooglePassword>" &: Поиск строки "<GooglePassword>password</GooglePassword>"
set "sz1=s_username" &: Здесь указать что вместо username
set "sz2=s_password" &: Здесь указать что вместо password

<"setting.xml">>$ (for /f "delims=" %%a in ('more') do @(
  echo "%%~a"|>nul find "%sf1%" && (
   for /f "tokens=1-3 delims=>< " %%b in ("%%~a") do @set "z1=%%c"& echo:  ^<%%b^>!z1:%%c=%sz1%!^<%%d^>
  ) || (
   echo "%%~a"|>nul find "%sf2%" && for /f "tokens=1-3 delims=>< " %%b in ("%%~a") do @set "z2=%%c"& echo:  ^<%%b^>!z2:%%c=%sz2%!^<%%d^>
  ) || (
   echo %%a
  )
 )
)
move $ "setting.xml"
exit
Это сообщение посчитали полезным следующие участники:

Отправлено: 13:34, 28-04-2021 | #15


Новый участник


Сообщения: 9
Благодарности: 0

Профиль | Отправить PM | Цитировать


Цитата alpap:
странно как вы обходите <> при записи »
так в первом сообщении как раз показал как я замену строки с <>реализовал.

Цитата alpap:
разбирайтесь, помогать не буду »
В принципе Вы и так уже достаточно много подсказали в предыдущих постах.

Остался только один вопрос, который задал в своем предыдущем сообщении. А именно, почему значение переменной не меняется правильно при одинаковом подходе к работе с переменными?

Отправлено: 13:54, 28-04-2021 | #16


Новый участник


Сообщения: 9
Благодарности: 0

Профиль | Отправить PM | Цитировать


Нашел свою ошибку. И она не очевидна для новичка.
Код: Выделить весь код
@echo off

setlocal enabledelayedexpansion

set conf=Config.xml
set temp=temp.xml
set kwd="NewKeyWord1"

rem проверяю на наличие временного файла и если он есть - удаляю
if exist %temp% del /q /f %temp%


rem ищу необходимое словосочетание
for /f "usebackq delims=^; tokens=2" %%a in (`findstr /rc:"KeyWord1"^=^.*^; %conf%`) do (
  set var=%%a

rem из словосочетания забираю необходимый для замены ключ
  for /f "usebackq" %%s in (`cmd /v /c "echo !var:KeyWord1=!"`) do (
    set kwrd=%%s
  )
)
set kwrd=%kwrd:~1%

rem цикл записи всех строк во временный файл
for /f "tokens=*" %%q in (%conf%) do (
  set line=%%q

rem записываю все строки во временный файл и при нахождении ключа kwrd в какой-либо строке 
rem меняет его на ключ kwd
  echo !line:%kwrd%=%kwd%!>>%temp%
)

rem перезаписываем временный файл в конфигурационный файл
move /y %temp% %conf%

endlocal
exit /b
Вся проблема заключалась в том что переменная %kwrd% имела в начале своего значение символ равенства. В связи с чем необходимо было просто удалить данный символ строкой set kwrd=%kwrd:~1%.

Отправлено: 16:29, 30-04-2021 | #17



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Замена текста между определенными символами

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
VBS/WSH/JS - как удалить блок текста между символами ruslaw Скриптовые языки администрирования Windows 3 01-07-2015 00:43
Замена текста между двумя подстроками-границами, регулярные выражения в Perl Тишина Программирование в *nix 2 11-08-2014 18:59
CMD/BAT - Замена текста Fevzy Скриптовые языки администрирования Windows 9 28-04-2013 21:22
CMD/BAT - Поиск строки с определенными символами dima9069 Скриптовые языки администрирования Windows 13 26-12-2012 06:44
CMD/BAT - [решено] Замена текста между тегов vano42 Скриптовые языки администрирования Windows 5 09-08-2012 13:19




 
Переход