Показать полную графическую версию : [решено] Замена текста между определенными символами
localmaster
24-04-2021, 17:06
Добрый день!
Запускать на компах разрешено ТОЛЬКО *.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
Помогите, пожалуйста, начинающему... Заранее спасибо.
Запускать на компах разрешено ТОЛЬКО *.bat файлы.
Есть файлик настроек XML… »
Как именно запрещено остальное?
localmaster
25-04-2021, 20:53
Как именно запрещено остальное? »
не понимаю как данный вопрос относится к сути моего вопроса, но все же отвечу:
Существует ПО, которое по правилам которого запрещено запускать различные типы файлов, единственное что оставили для работы - выполнение скриптов типа *.bat. Выполнение скриптов PS заблокировано.
localmaster, обычно к первому посту прикладывают образец файла, чтобы видеть его структуру и кодировку. Допускается-ли применение сторонних утилит для замены значений параметров?
localmaster
26-04-2021, 00:03
чтобы видеть его структуру и кодировку »
Обычный xml документ сплошная латиница. Структура:
куча параметров
куча параметров
куча параметров
100500 параметров
<Parametr KeyWord="Key";KeyWord1="Key1!№%?*()-=+_";KeyWord2="Key2">
куча параметров
куча параметров
<Parametr>Enable</Parametr>
100500 параметров
Допускается-ли применение сторонних утилит для замены значений параметров? »
Использование сторонних утилит не возможно.
Уже видно, что это отнюдь не:
Обычный xml документ »
Видно не сильно нужно.
DJ Mogarych
26-04-2021, 09:58
единственное что оставили для работы - выполнение скриптов типа *.bat. Выполнение скриптов PS заблокировано. »
Ну и маразм... извините.
А ps1 из-под bat можно запустить? Просто с xml работать из cmd - удовольствие сильно на любителя, а PS с этим хорошо справляется.
localmaster
26-04-2021, 10:59
Ну и маразм... извините. »
Живем с тем что есть...
А ps1 из-под bat можно запустить? »
К сожалению нельзя(
Просто с xml работать из cmd - удовольствие сильно на любителя, а PS с этим хорошо справляется. »
Согласен. Пытаюсь работать как с текстовым файлом.
единственное что оставили для работы - выполнение скриптов типа *.bat »
а нельзя этому кому-то позвонить и сказать пусть сами на bat вытягивают информацию из
KeyWord1="Key1!№%?*()-=+_";KeyWord2="Key2"> »
при
100500 параметров »
я на bat такое бесплатно точно не стал бы делать и даже в этом случае тут не один раз надо общаться т.к. что-нибудь да где-нибудь вылезет и не пойдет.
localmaster
26-04-2021, 20:15
я на bat такое бесплатно точно не стал бы делать »
Не знаю в чем проблема пропарсить документ любой длины поиском уникальной комбинации ключей KeyWord1 и KeyWord2.
Из того что нашел, пока понял что возможно для поиска необходимой строки использовать findstr
for /f "delims=" %%i in ('
findstr /irc:";KeyWord1="[^;]*";KeyWord2" %conf%
') do (
таким образом я вроде бы нашел строку, а что дальше делать, никак понять не могу.
а что дальше делать »
нужно перечитать все строки с поиском нужной и ее заменой и вывести в временный файл, а потом содержимым временного файла переписать исходный. И всю дорогу надо следить за спецсимволами. кодировками, концами строк, пустыми строками, форматированием.
localmaster
27-04-2021, 14:56
нужно перечитать все строки с поиском нужной
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
Вроде с поиском и заменой неизвестного ключа решение найдено.
@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
Где я допускаю ошибку?
правильно, рано или поздно при дальнейших действиях на cmd или его обсуждениях в рамках данной задачи смысл уходит как вода через сито (скромно если, на самом деле быстрее) »
В связи с тем что я на данный момент только изучаю CMD и ее возможности, то на дне этого сита лежит хороший слой глины, который не пропускает смысл и знания. С момента начала работы над данной задачей узнал и, самое главное, понял как правильно строить логику работы с текстовыми файлами, то что использование, хотя бы, PS, не говоря уже о языках программирования (хотя бы Python), будет намного проще и удобнее.
Параметр находится между <Parametr> и </Parametr> »
странно как вы обходите <> при записи
хочется играться с cmd вот два примера, с поиском и заменой одной строки или сразу двух, разбирайтесь, помогать не буду, я уже отошел от того чтобы писать 20 строк на cmd там где достаточно 2-х, например на xml.exe
@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
@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
странно как вы обходите <> при записи »
так в первом сообщении как раз показал как я замену строки с <>реализовал.
разбирайтесь, помогать не буду »
В принципе Вы и так уже достаточно много подсказали в предыдущих постах.
Остался только один вопрос, который задал в своем предыдущем сообщении. А именно, почему значение переменной не меняется правильно при одинаковом подходе к работе с переменными?
localmaster
30-04-2021, 16:29
Нашел свою ошибку. И она не очевидна для новичка.
@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%.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.