1 (изменено: Yury, 2015-10-24 03:52:27)

Тема: CMD/BAT: Замена части строки в XML-файле частью строки из INI-файлa

ihoming пишет:

Доброго времени суток, профессионалы! Не нашёл подходящей темы и чтобы не засорять форум другими темами, выбрал эту тему, которая отдалённо имеет отношение к моему обращению.

Прошу вашей помощи, так как сам не смог разобраться со своей проблемой.

В одной и той же папке на компьютере находятся два файла listing.xml и teknogods.ini

Файл teknogods.ini выглядит так:


[Settings]
Name=NICKNAME
ID=41bcef57
FOV=90
[Network]
NetworkInterface=255
NetworkInterfaceList=[0 = 192.168.0.101; 255 (default) = ANY IP]

А файл listing.xml выглядит так:


<?xml version="1.0" standalone="yes"?>
<DocumentElement>
  <ProcData>
    <v_path>iw5mp.exe</v_path>
    <v_nick>????????</v_nick>
  </ProcData>
</DocumentElement>

Нужен батник (скрипт), который пропишет   в строке     <v_nick>????????</v_nick> (в данном варианте на нужном месте размещены знаки вопроса) файла listing.xml значение после знака = (слово NICKNAME) из строки Name=NICKNAME  файла teknogods.ini.

Другими словами пропишется в строке и будет выглядеть так:


<?xml version="1.0" standalone="yes"?>
<DocumentElement>
  <ProcData>
    <v_path>iw5mp.exe</v_path>
    <v_nick>NICKNAME</v_nick>
  </ProcData>
</DocumentElement>


Код пакетного файла:


@echo off

set "ini=teknogods.ini"
set "xml=listing.xml"

for /f %%i in ('^<"%xml%" find/c /v ""') do (
 for /f "tokens=2 delims==" %%j in ('findstr/bilc:"Name=" "%ini%"') do <"%xml%">.tmp (
  for /l %%k in (1 1 %%i) do (
   set "x="& set/p x=& if defined x (
    cmd/v/c "if "!x!" equ "!x:*^<v_nick^>=!" (echo.!x!) else (echo     ^<v_nick^>%%j^</v_nick^>)"
   ) else echo.
  )
 )
)
>nul move .tmp "%xml%"

exit/b



ihoming пишет:

Заранее благодарен.



Благодарности принимаю в виде написания отзыва после нажатия на кнопку "+" в меню "Репутация".

2 (изменено: ihoming, 2015-10-24 07:51:09)

Re: CMD/BAT: Замена части строки в XML-файле частью строки из INI-файлa

Ваш батник замечательно отработал, всё прописалось. Большое Вам человеческое спасибо!
Докладываю, нажата кнопка "+" в меню "Репутация" со словами благодарности. Спасибо ещё раз.

3

Re: CMD/BAT: Замена части строки в XML-файле частью строки из INI-файлa

Добрый день, Ваш батник оказался весьма кстати полезным, но вот только он не совсем корректно отрабатывает в моем случае. Не могли бы Вы по возможности взглянуть на мою проблему:
Есть ip.txt файл содержащий ipv4 адрес

xxx.xxx.xxx.xxx

и есть файл options.xml в котором нужно заменить значение параметра Binding на ip адрес из первого файла, вот часть этого файла

<TCPPort>7551</TCPPort>                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              
      <Binding>192.168.10.2</Binding>                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              
      <MulticastGroup>231.0.0.1</MulticastGroup>

в моей ситуации скрипт почему-то останавливается на середине xml файла и завершает работу.
Я предполагаю, что это как-то связано с некорректной отработкой строки

for /f %%i in ('^<"%xml%" find/c /v ""')

потому как если я удалю в xml файле строки с начала и до нужного места + несколько дополнительных параметров и аналогично после нужного места до конца файла (то есть уменьшу количество строк) то скрипт отрабатывает отлично.

Заранее спасибо.

4

Re: CMD/BAT: Замена части строки в XML-файле частью строки из INI-файлa

kikler пишет:

Я предполагаю, что это как-то связано с некорректной отработкой строки

for /f %%i in ('^<"%xml%" find/c /v ""')

В этой строке определяется количество строк в *.xml и определяется правильно (519).
А вот что можно заметить: если в BORGOptions.xml удалить пробелы с концов строк, то его размер уменьшится с 977 до 19 КБ, после чего он обрабатывается полностью.

5

Re: CMD/BAT: Замена части строки в XML-файле частью строки из INI-файлa

shiz пишет:

А вот что можно заметить: если в BORGOptions.xml удалить пробелы с концов строк, то его размер уменьшится с 977 до 19 КБ, после чего он обрабатывается полностью.

Не хотелось бы наглеть, но попробовав самостоятельно использовать пример из ветки http://forum.script-coding.com/viewtopic.php?id=9370 получил время обработки файла порядка 10 минут, но все отработало нормально. Может у вас есть скрипт по-шустрее?

6 (изменено: wisgest, 2016-02-11 12:40:50)

Re: CMD/BAT: Замена части строки в XML-файле частью строки из INI-файлa

kikler пишет:

Может у вас есть скрипт по-шустрее?

Использовать AkelPad 4 из командной строки:

AkelPad.exe /Show(0) /OpenFile("test.txt") /Command(4157) /Command(4174) /SaveFile("test.txt") /quit

(не сработает, если файл уже открыт на редактирование и в настройках задано «Не открывать файл дважды»).
/Show(0) — запуск в скрытом окне;
/Command(4157) — выделить всё;
/Command(4174) — удалить Tab'ы и пробелы с концов строк.