Форум программистов, компьютерный форум, киберфорум
Batch (CMD/BAT)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.76/21: Рейтинг темы: голосов - 21, средняя оценка - 4.76
0 / 0 / 0
Регистрация: 31.05.2016
Сообщений: 20

Замена части строки XML-файла

20.02.2019, 16:26. Показов 5141. Ответов 38
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте.
Помогите, пожалуйста, заменить часть строки xml файла, с помощью bat файла.

вот образец:
<?xml version="1.0" encoding="UTF-8"?><external-systems xmlns="ееее">
<service-provider id="60385241">
<processing-provider>
<service-type/>
</processing-provider>
<property value="5" key="exciseValidationServerTimeout" id="228959817"/>
<property value="30" key="egais_timeout" id="177988722"/>
<property value="0" key="depthInDays" id="228959814"/>
</service-provider>
<service-provider name="Set:Prisma" settingsOnShop="false" id="426843810">
<processing-provider localized-name="Set:Prisma" name="prismabridge">
<service-type localized-name="Призма" name="prismabridge"/>
</processing-provider>
<property value="5.5.5" key="prisma_url" id="180200581"/>
</service-provider>
</external-systems>


эти символы нужно заменить на значение переменной.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
20.02.2019, 16:26
Ответы с готовыми решениями:

Замена части строки XML-файла
Здравствуйте. Помогите, пожалуйста, заменить часть строки xml файла, с помощью bat файла. вот образец: &lt;request&gt; ...

Вывод заданной части определённой строки каждого XML-файла в указанной папке
Добрый день! Есть папка, в которую закачиваются файлы с ftp несколько раз в день. Названия файлов типа:3143719278_1605201290029.xml ...

Замена части имени файла
Всем доброго времени суток! столкнулся с такой задачей, нужно автоматизировать процесс замены части названия файла а именно: исходный:...

38
 Аватар для KDE777
1886 / 1108 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
20.02.2019, 16:44
Цитата Сообщение от iRas Посмотреть сообщение
заменить часть строки xml файла, с помощью bat файла.
Предложу PowerShell вариант:

PowerShell
1
[xml]$xml=gc 'c:\1\1.xml'; $xml.GetElementsByTagName('property')|?{$_.Value -eq '5.5.5'}|%{$_.value='6.6.6'}; $xml.Save('c:\1\2.xml')
1
 Аватар для ZoOoO
226 / 211 / 70
Регистрация: 09.02.2016
Сообщений: 1,040
20.02.2019, 16:44
Как бы вот.Заменит все 5.5.5 на 0.0.0 Только вопрос.Они всегда такие или могут быть и другие циферки?А если в коде будут еще 5.5.5, то все надо менять или только те ,которые обозначены красным?
Windows Batch file
1
2
3
4
5
6
7
8
9
10
@echo off
Setlocal EnableDelayedExpansion
set "c=0.0.0" 
for /f "delims=" %%a in (001.xml) do (
set a=%%a
set b=!a:5.5.5=%c%!
echo !b!>>002.xml
)
move 002.xml 001.xml
pause
0
0 / 0 / 0
Регистрация: 31.05.2016
Сообщений: 20
20.02.2019, 17:59  [ТС]
ZoOoO,
странно, при первом запуске работало, а теперь пишет
'<?xml' is not recognized as an internal or external command,
operable program or batch file.

и новый файл 002 пустой.

Добавлено через 14 минут
ZoOoO,
с первой проблемой разобрался.
спасибо.

а вот еще что, как вместо set "c=0.0.0" указать составную переменную?
Например в цикле
FOR %%P IN (1 2) DO (
set "c=0.%%P.0"

что бы было 0.1.0 а потом 0.2.0

Добавлено через 6 минут
ZoOoO, спасибо!

а вот еще что, пара дополнительных моментов:
1. как вместо set "c=0.0.0" указать составную переменную?
Например в цикле
FOR %%P IN (1 2) DO (set "c=0.%%P.0"

что бы было 0.1.0 а потом 0.2.0 как сослаться на значение цикла?

2. Как этим же значением заменить значение 30? value=30 из 7 строки
0
 Аватар для ZoOoO
226 / 211 / 70
Регистрация: 09.02.2016
Сообщений: 1,040
20.02.2019, 18:13
Windows Batch file
1
2
3
4
5
6
7
8
@echo off
Setlocal EnableDelayedExpansion
for /l %%a in (1,1,5) do (
set b=%%a
set b=0.!b!.0
echo !b!
)
pause
Добавлено через 1 минуту
Цитата Сообщение от iRas Посмотреть сообщение
2. Как этим же значением заменить значение 30? value=30 из 7 строки
ПРоблема в том,будет ли это значение индивидуальное.Просто тогда все значения 30 заменятся.И не понятно, что значит заменить с помощью цикла выше.
0
4340 / 2130 / 661
Регистрация: 26.04.2015
Сообщений: 6,823
20.02.2019, 18:48
iRas, у вас файл в utf-8, но содержит кириллицу, при замене чего-то внутри с помощью cmd, придется переносить все в новый файл с изменениями и оттуда обратно переписывать в старый (так уж работает этот cmd - увы) и неизбежно получите проблемы с кодировкой или в виде кракозябров или вообще вылета.
Поэтому, если хотите правильно надежно и лаконично, прислушайтесь к KDE777.
0
0 / 0 / 0
Регистрация: 31.05.2016
Сообщений: 20
21.02.2019, 10:22  [ТС]
ZoOoO,

да, второе значение для изменения - индивидуальное в составе файла
0
 Аватар для ZoOoO
226 / 211 / 70
Регистрация: 09.02.2016
Сообщений: 1,040
21.02.2019, 10:56
Ну,вот,я код на написал,только как это соединить,я неипонимаю.Я не понимаю,что надо.
0
0 / 0 / 0
Регистрация: 31.05.2016
Сообщений: 20
21.02.2019, 11:02  [ТС]
alpap, ZoOoO, KDE777,

я сформулирую задачу целиком.
есть циклы:
FOR %%I IN (100 101 102) DO (

FOR %%Q IN (1 2 3 4 5 6 7 8 9 10 DO (

FOR %%P IN (1 2 3 4 5 6 7 8) DO (

значение переменной должно быть %dest% = 10.%%I.%%Q.37
так вот, эту dest нужно подставить в xml в последнем цикле.

в XML есть блоки
<service-provider name="1">
<processing-provider localized-name="1" name="1">
<service-type localized-name="1" name="1"/>
</processing-provider>
<property value="http://10.101.50.37:8080/xml" key="egais_url" id="177982936"/>
<property value="http://10.101.50.37:9000" key="exciseValidationServerAddress" id="229240738"/>
<property value="0" key="egaisExciseCheckValidationTimeout" id="229240737"/>
</service-provider>
<service-provider name="Set:Prisma" settingsOnShop="false" id="426843810">
<processing-provider localized-name="Set:Prisma" name="prismabridge">
<service-type localized-name="Призма" name="prismabridge"/>
</processing-provider>
<property value="10.101.50.30" key="prisma_url" id="180200581"/>
</service-provider>
0
 Аватар для KDE777
1886 / 1108 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
21.02.2019, 11:25
Цитата Сообщение от iRas Посмотреть сообщение
я сформулирую задачу целиком.
Можно просто точно описать, что вам нужно? Без всяких циклов. Циклы, если понадобятся, отвечающие предложат сами.

Я правильно понял: найти все xml-элементы property, у которых значение value содержит IP адрес (любой?) и этот IP нужно заменить на новый? Т.е. все найденные IP в property value нужно заменить на один новый IP.

Или нужно что-то другое?

xml-документ - это не просто текст, а формализованная структура, в которой можно манипулировать только нужными элементами/значениями.
0
0 / 0 / 0
Регистрация: 31.05.2016
Сообщений: 20
21.02.2019, 11:44  [ТС]
KDE777,
Цитата Сообщение от KDE777 Посмотреть сообщение
Можно просто точно описать, что вам нужно? Без всяких циклов. Циклы, если понадобятся, отвечающие предложат сами.
циклы уже есть. в них именно так выполняются другие операции с файлами. по всей распределенной сети. от них отказаться не могу.

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

оправка производится к примеру так: но это за рамками задачи. это рабочий инструмент отправка файлов на хосты.
FOR /F "tokens=*" %%J IN ('ECHO y ^| pscp.exe -pw "324012" -r -scp -unsafe -P 22 tc@10.%%I.%%Q.2%%P:%send_from% scanlog10.%%I.%%Q.2%%P ^|^|ECHO. - ERROR') DO (ECHO %%I .. tc@10.%%I.%%Q.2%%P: .. %%J>>Logs/%logfile%)


Цитата Сообщение от KDE777 Посмотреть сообщение
найти все xml-элементы property, у которых значение value содержит IP адрес (любой?) и этот IP нужно заменить на новый? Т.е. все найденные IP в property value нужно заменить на один новый IP.
количество известно. их 3.
есть шаблонный файл. в нем указан 1 адрес в 3-х местах. 10.101.50.37. его нужно заменить и отправить результат на хост. предыдущий вариант решения подошел для замены одного значения. за что я очень благодарен автору
0
 Аватар для ZoOoO
226 / 211 / 70
Регистрация: 09.02.2016
Сообщений: 1,040
21.02.2019, 11:53
Есть куча XML файлов в которых есть одинаковые значения у строк property value и мы эти значения знаем. Нам надо эти значения заменить своими,которые получаются с помощью циклов
Цитата Сообщение от iRas Посмотреть сообщение
FOR %%I IN (100 101 102) DO (
FOR %%Q IN (1 2 3 4 5 6 7 8 9 10 DO (
?И еще вопрос.
А как получается вот это значение
Цитата Сообщение от iRas Посмотреть сообщение
<property value="10.101.50.30" key="prisma_url" id="180200581"/>
Добавлено через 2 минуты
то есть нам нужны только эти значения 100,101,102?Просто они вставляются каждый раз разные и так по кругу,пока не закончатся XML файлы?
0
0 / 0 / 0
Регистрация: 31.05.2016
Сообщений: 20
21.02.2019, 12:02  [ТС]
ZoOoO,
Цитата Сообщение от ZoOoO Посмотреть сообщение
Есть куча XML файлов в которых есть одинаковые значения у строк property value и мы эти значения знаем. Нам надо эти значения заменить своими,которые получаются с помощью циклов
есть шаблонный файл. в нем указан 1 адрес в 3-х местах. 10.101.50.37. его нужно заменить и отправить результат на хост


FOR %%I IN (100 101 102) DO (

FOR %%Q IN (1 2 3 4 5 6 7 8 9 10 DO (

FOR %%P IN (1 2 3 4 5 6 7 8) DO (

в последнем цикле %%P заменить шаблонное значение из файла на значение переменной %dest% = 10.%%I.%%Q.37

Добавлено через 4 минуты
пока что у меня
@echo off
Setlocal EnableDelayedExpansion
FOR %%I IN (101) DO (
FOR %%Q IN (50) DO (
set "c=10.%%I.%%Q.37"
FOR /f "delims=" %%a in (002.xml) do (
set a=%%a
set b=!a:0.0.0=%c%!
echo !b!>> 1.xml

у меня в 1.xml пусто значение подставляется . видимо это некорректно set "c=10.%%I.%%Q.37"
0
 Аватар для ZoOoO
226 / 211 / 70
Регистрация: 09.02.2016
Сообщений: 1,040
21.02.2019, 12:03
ну,я понял,что надо 10.100.50.37 заменить на другие числа.С циклами только не понятно.Меня смущает 100,101,102.Это как надо что бы цикл выглядел или все таки мы имеем число от нуля до 255?И не понятно,что должен делать цикл последний.

Добавлено через 1 минуту
Для чего нам цикл нужен?ЧТо бы значения во всех XML файлах было разное?
0
0 / 0 / 0
Регистрация: 31.05.2016
Сообщений: 20
21.02.2019, 12:07  [ТС]
ZoOoO,
Цитата Сообщение от ZoOoO Посмотреть сообщение
Для чего нам цикл нужен?ЧТо бы значения во всех XML файлах было разное?
циклы уже есть. от них отказаться не можем. они нужны что бы каждый раз значение было разным.
с вашим предыдущим решением, с заменой 1 места, у меня выходит так, я убрал многие значения циклов для тестирования и пилотного применения на конкретном хосту
пока что у меня
@echo off
Setlocal EnableDelayedExpansion
FOR %%I IN (101) DO (
FOR %%Q IN (50) DO (
set "c=10.%%I.%%Q.37"
FOR /f "delims=" %%a in (002.xml) do (
set a=%%a
set b=!a:0.0.0=%c%!
echo !b!>> 1.xml

у меня в 1.xml пусто значение подставляется . видимо это некорректно set "c=10.%%I.%%Q.37"
0
 Аватар для ZoOoO
226 / 211 / 70
Регистрация: 09.02.2016
Сообщений: 1,040
21.02.2019, 12:11
Я понять не могу.Значения должны менятся в пределах этих адресов 10.100-102.1-10.37?
0
4340 / 2130 / 661
Регистрация: 26.04.2015
Сообщений: 6,823
21.02.2019, 12:19
iRas, Давайте код целиком и напишите - есть так, а надо поменять что-то чтобы стало так, без вашего вмешательства в код и примеров как это можно сделать.
У вас ОЧЕНЬ много непонятного, например этой строкой
Цитата Сообщение от iRas Посмотреть сообщение
echo !b!>> 1.xml
вы просто дописываете что-то в конец файла "1.xml", а не изменяете в нем там где нужно. Выше я рассказывал как делаются изменения при помощи cmd. Мне кажется вы еще ни разу этого не делали, отправляя готовый файл, а теперь столкнулись с этой задачей, которую на cmd решить сложно.
Надо понимать всю задачу целиком, возможно переписать весь код целиком, поэтому вас и просят объяснить все от начала до конца. а не приводить какие-то кусочки кода и ваши возможные потуги их залатать.
0
0 / 0 / 0
Регистрация: 31.05.2016
Сообщений: 20
21.02.2019, 12:27  [ТС]
Цитата Сообщение от alpap Посмотреть сообщение
вы просто дописываете что-то в конец файла "1.xml", а не изменяете в нем там где нужно. Выше я рассказывал как делаются изменения при помощи cmd. Мне кажется вы еще ни разу этого не делали, отправляя готовый файл, а теперь столкнулись с этой задачей, которую на cmd решить сложно.
Надо понимать всю задачу целиком, возможно переписать весь код целиком, поэтому вас и просят объяснить все от начала до конца. а не приводить какие-то кусочки кода и ваши возможные потуги их залатать.
да. вы правы.
вот скрипт по отправке файла.
@echo off
cd C:\tmp\mover\dest\
Setlocal EnableDelayedExpansion
SET logfile=transfer-%DATE:~0,2%_%DATE:~3,2%_%DATE:~6,4%
IF "%TIME:~0,1%"==" " (SET logfile=%logfile%-0%TIME:~1,1%) ELSE (SET logfile=%logfile%-%TIME:~0,2%)
SET logfile=%logfile%_%TIME:~3,2%_%TIME:~6,2 %.log

FOR %%I IN (100 101 102) DO (
FOR %%Q IN (1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99) DO (
FOR %%P IN (1 2 3 4 5 6 7 8) DO (
FOR /F "tokens=*" %%J IN ('ECHO y ^| pscp.exe -pw "111" -r -scp -unsafe -P 22 1.xml tc@10.%%I.%%Q.2%%P:/home/tc/storage/config ^|^|ECHO. - ERROR') DO (ECHO %%I .. tc@10.%%I.%%Q.2%%P: .. %%J>>Logs/%logfile%)
)


)
)
)
pause

перед отправкой, мне нужно в 1.xml указать в 3 местах значение 10.%%I.%%Q.37
0
 Аватар для ZoOoO
226 / 211 / 70
Регистрация: 09.02.2016
Сообщений: 1,040
21.02.2019, 12:38
сча
0
4340 / 2130 / 661
Регистрация: 26.04.2015
Сообщений: 6,823
21.02.2019, 12:43
Цитата Сообщение от iRas Посмотреть сообщение
да. вы правы.
Цитата Сообщение от iRas Посмотреть сообщение
мне нужно в 1.xml указать в 3 местах значение 10.%%I.%%Q.37
Ну вот и приехали в начало.
1.xml, если содержит кириллицу (в вашем примере содержит), а кодировку имеет utf-8 и однозначно поломается при перезаписи, также поломается форматирование файла xml. Не спрашиваю согласны вы с этим или нет, а утверждаю что делать это (изменение данных) надо или отдельной утилитой или powershell или vbs/js, вы с помощью cmd все угробите, в штатном блокноте вы даже в кодировке 866 не сможете его сохранить, а на той стороне еще перекодировать надо?
Надо брать каждую строку, находить нужную, делать в ней замену (или переписывать на новую) и эту каждую строку записывать в новый файл 1.xml, а старый удалять или во временный файл и удалять а временный менять на 1.xml, но неважно, кодировка и форматирование точно пострадают, а это не просто слова - пострадают данные, можно допустить ошибки, у cmd сложности с записью спецсимволов коих в xml хватает или что еще будет на момент когда все работало.

Добавлено через 1 минуту
а что вы выводите строкой?
Windows Batch file
1
pscp.exe -pw "324012" -r -scp -unsafe -P 22 tc@10.%%I.%%Q.2%%P:%send_from% scanlog10.%%I.%%Q.2%%P
в цикле
Windows Batch file
1
2
3
4
5
6
7
FOR %%I IN (100 101 102) DO (
 FOR %%Q IN (1 2 3 4 5 6 7 8 9 10 DO (
  FOR %%P IN (1 2 3 4 5 6 7 8) DO (
   >>file.txt (@ECHO y|pscp.exe -pw "324012" -r -scp -unsafe -P 22 tc@10.%%I.%%Q.2%%P:%send_from% scanlog10.%%I.%%Q.2%%P || ECHO. - ERROR)
  )
 )
)
зачем эта строка оборачивается в свой цикл?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
21.02.2019, 12:43
Помогаю со студенческими работами здесь

Замена части строки в текстовом файле
Добрый вечер. Необходима помощь в написании bat, который бы заменил: &quot;restore_ps&quot;: на &quot;restore_ps&quot;: Учитывая что...

Замена определённой части имени каждого файла из заданного каталога
Прошу помощи! Нужно в имени файла заменить только 2015 на 2017. Текст находится в середине имени файла. Например: админ 2015 суд.doc...

Замена части строки файла
Всем привет!!! есть файл(1.txt) с примерным текстом #@# 3686|Иванов |07.07.2014|15.07.2014|0| | . | . | I - 16...

Замена строки (целиком), найденная по части строки
Добрый день! Необходимо в файле найти строку по ее части, и заменить ее (строку целиком на новое значение). файл: ...

Замена части строки
Дано 3 строки: a,b,c. Строка а включает в себя строку b. В строке а нужно найти строку b и заменить на строку с. например: ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru