localmaster |
24-04-2021 17:06 2956341 |
Замена текста между определенными символами
Добрый день!
Запускать на компах разрешено ТОЛЬКО *.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
Помогите, пожалуйста, начинающему... Заранее спасибо.
|
Цитата:
Цитата localmaster
Запускать на компах разрешено ТОЛЬКО *.bat файлы.
Есть файлик настроек XML… »
|
Как именно запрещено остальное?
|
localmaster |
25-04-2021 20:53 2956380 |
Цитата:
Цитата Iska
Как именно запрещено остальное? »
|
не понимаю как данный вопрос относится к сути моего вопроса, но все же отвечу:
Существует ПО, которое по правилам которого запрещено запускать различные типы файлов, единственное что оставили для работы - выполнение скриптов типа *.bat. Выполнение скриптов PS заблокировано.
|
localmaster, обычно к первому посту прикладывают образец файла, чтобы видеть его структуру и кодировку. Допускается-ли применение сторонних утилит для замены значений параметров?
|
localmaster |
26-04-2021 00:03 2956391 |
Цитата:
Цитата sov44
чтобы видеть его структуру и кодировку »
|
Обычный xml документ сплошная латиница. Структура:
Код:
куча параметров
куча параметров
куча параметров
100500 параметров
<Parametr KeyWord="Key";KeyWord1="Key1!№%?*()-=+_";KeyWord2="Key2">
куча параметров
куча параметров
<Parametr>Enable</Parametr>
100500 параметров
Цитата:
Цитата sov44
Допускается-ли применение сторонних утилит для замены значений параметров? »
|
Использование сторонних утилит не возможно.
|
Уже видно, что это отнюдь не:
Видно не сильно нужно.
|
DJ Mogarych |
26-04-2021 09:58 2956403 |
Цитата:
Цитата localmaster
единственное что оставили для работы - выполнение скриптов типа *.bat. Выполнение скриптов PS заблокировано. »
|
Ну и маразм... извините.
А ps1 из-под bat можно запустить? Просто с xml работать из cmd - удовольствие сильно на любителя, а PS с этим хорошо справляется.
|
localmaster |
26-04-2021 10:59 2956413 |
Цитата:
Цитата DJ Mogarych
Ну и маразм... извините. »
|
Живем с тем что есть...
Цитата:
Цитата DJ Mogarych
А ps1 из-под bat можно запустить? »
|
К сожалению нельзя(
Цитата:
Цитата DJ Mogarych
Просто с xml работать из cmd - удовольствие сильно на любителя, а PS с этим хорошо справляется. »
|
Согласен. Пытаюсь работать как с текстовым файлом.
|
Цитата:
Цитата localmaster
единственное что оставили для работы - выполнение скриптов типа *.bat »
|
а нельзя этому кому-то позвонить и сказать пусть сами на bat вытягивают информацию из
Цитата:
Цитата localmaster
KeyWord1="Key1!№%?*()-=+_";KeyWord2="Key2"> »
|
при
я на bat такое бесплатно точно не стал бы делать и даже в этом случае тут не один раз надо общаться т.к. что-нибудь да где-нибудь вылезет и не пойдет.
|
localmaster |
26-04-2021 20:15 2956456 |
Цитата:
Цитата alpap
я на bat такое бесплатно точно не стал бы делать »
|
Не знаю в чем проблема пропарсить документ любой длины поиском уникальной комбинации ключей KeyWord1 и KeyWord2.
Из того что нашел, пока понял что возможно для поиска необходимой строки использовать findstr
Код:
for /f "delims=" %%i in ('
findstr /irc:";KeyWord1="[^;]*";KeyWord2" %conf%
') do (
таким образом я вроде бы нашел строку, а что дальше делать, никак понять не могу.
|
нужно перечитать все строки с поиском нужной и ее заменой и вывести в временный файл, а потом содержимым временного файла переписать исходный. И всю дорогу надо следить за спецсимволами. кодировками, концами строк, пустыми строками, форматированием.
|
localmaster |
27-04-2021 14:56 2956502 |
Цитата:
нужно перечитать все строки с поиском нужной
|
Код:
for /f "usebackq delims=^; tokens=2" %%a in (`findstr /rc:"KeyWord1"^=^.*^; %temp%`) do (
set var=%%a
echo !var!
)
Выводит единственное словосочетание KeyWord1="Key1!№%?*()-=+_"
Цитата:
и ее заменой и вывести в временный файл
|
Пока не понял как выцепить из этого "Key1!№%?*()-=+_" и заменить, с учетом того что в значении так же могут фигурировать знаки "="
Цитата:
а потом содержимым временного файла переписать исходный.
|
это знаю, можно использовать MOVE.
|
правильно, рано или поздно при дальнейших действиях на cmd или его обсуждениях в рамках данной задачи смысл уходит как вода через сито (скромно если, на самом деле быстрее)
|
localmaster |
28-04-2021 12:09 2956555 |
Вроде с поиском и заменой неизвестного ключа решение найдено.
Код:
@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
Параметр находится между <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
|
localmaster |
28-04-2021 13:54 2956568 |
Цитата:
Цитата alpap
странно как вы обходите <> при записи »
|
так в первом сообщении как раз показал как я замену строки с <>реализовал.
Цитата:
Цитата alpap
разбирайтесь, помогать не буду »
|
В принципе Вы и так уже достаточно много подсказали в предыдущих постах.
Остался только один вопрос, который задал в своем предыдущем сообщении. А именно, почему значение переменной не меняется правильно при одинаковом подходе к работе с переменными?
|
localmaster |
30-04-2021 16:29 2956778 |
Нашел свою ошибку. И она не очевидна для новичка.
Код:
@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%.
|
Время: 21:46.
© OSzone.net 2001-