Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] работа с XML файлом (http://forum.oszone.net/showthread.php?t=171467)

taravasya 28-03-2010 03:48 1378857

работа с XML файлом
 
Есть xml файл, следующего содержания:
Код:

<?xml version="1.0" encoding="utf-8"?>
<process><datetime>2010-03-27T12:01:35+02:00</datetime><code>500</code></process>

Естественно дата меняется регулярно в зависимости от времени внесения изменений в файл.
Цифры заключенные в теге code(в данном случае 500), так же варьируются(например 200, 250, 400, 500, 2000 и т.д.)
Задача:
Заменить из командной строки, цифры заключённые в теге code на 100
Если указывать явно, что на что менять то проблем нет. Но я не всегда заранее знаю, что в этом файле. А вот так что-бы заменить
Код:

<code>???</code>
- хоть убей ничего не выходит.
Не помог ни sed for Windows(хотя с ним я возможно не разобрался как следует, но уже сил не хватило моральных) ни CHGSTR.EXE(последний позволяет задать параметры поиска только для всей строки. а менять дату в этой строке нельзя.)
Спасибо.

El Sanchez 28-03-2010 12:56 1378984

taravasya,

Код:

@echo off
setlocal EnableDelayedExpansion

set "Source=C:\Temp\Test.xml"
set "Output=C:\Temp\Test_output.xml"
set n=0

for /f "tokens=*" %%a in ('type %Source%') do (
        set /a n+=1
        set "str=%%a"
        if !n! NEQ 1 (
                for /f "tokens=2-6* delims==>" %%b in ('set str') do (
                        echo %%b^>%%c^>%%d^>%%e^>100^</code^>%%g>>%Output%
                )
        ) else (
                for /f "tokens=1* delims==" %%b in ('set str') do (
                        echo %%c>>%Output%
                )
        )
)


taravasya 28-03-2010 13:44 1379014

Ох..... Спасибо. Уже не в первый раз выручаете. Сам бы, ни за что не составил бы такой скрипт....
Теперь остаётся прочитать Test_output.xml, и заменить его содержимым, содержимое Test.xml. С этим я думаю справлюсь. Ещё раз спасибо.

Nike-jersey 19-05-2017 16:41 2738081

Приветствую!
У меня схожая задача, поэтому надеюсь добрые люди здесь помогут.
Дано: XML файл. В нём есть строка <UserId>OFFICE\Admin</UserId>
и нужно написать bat файл для автоматического редактирования OFFICE\Admin на имя ПК и имя текущего пользователя.
Какие в таком случае нужно использовать переменные?
Я второй день постигаю искусство написания скриптов. Вчера написал свой первый скрипт по пересозданию задания планировщика задач Windows.
Прошу помощи.

alpap 19-05-2017 17:42 2738095

Nike-jersey,
если ничего "экзотического" в строках нет, будет работать и это:
Код:

@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


greg zakharov 19-05-2017 22:40 2738123

Самый простой способ разбора xml из командной строки - использовать xmlstarlet:
Код:

xml -L -u "/process/code" -v 1000 logged.xml
Тем более, что xmlstarlet умеет принимать данный из stdin.

Iska 20-05-2017 01:07 2738144

greg zakharov, речь про это: XMLStarlet - Wikipedia? Я не работал. Как он Вам показался?

greg zakharov 20-05-2017 17:03 2738262

Iska, речь именно о нем. Кто бы что о нем не говорил, вещь очень хорошая. Если в трех словах - sed для xml. И этим, в общем-то, все сказано. Плохо, правда, что под Windows из исходников собирается с полпинка.

Iska 20-05-2017 17:40 2738274

greg zakharov, спасибо, ясно.

Nike-jersey 25-05-2017 15:17 2739549

Вложений: 2
Цитата:

Цитата alpap
@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 »

Было
Стало
Я попытался разобраться, что-то сложно.

greg zakharov 25-05-2017 19:25 2739634

Nike-jersey, Вы бы привели пример файла. Примерное решение будет таким:
Код:

@echo off
  setlocal enabledelayedexpansion
    @<my.xml>my.xml:s1 (for /f "delims=" %%i in ('more') do (
      echo:"%%~i"|>nul findstr /irc:"office\\admin"&&(
        set "s=%%~i"
        echo !s:office\admin=Domain\User!
      )||echo:%%~i
    ))&&(more < my.xml:s1 > my.xml)
  endlocal
exit /b


Iska 26-05-2017 06:02 2739730

greg zakharov, не, я конечно, понимаю тягу к изыскам, но не настолько же неуёмным: то, что оригинальный файл в итоге так и остаётся с дополнительным потоком, не есть хорошо и правильно.

greg zakharov 26-05-2017 09:20 2739762

Iska, при перезаписи основного потока ADS затирается. Если нет, загляните в групповые политики.

Iska 26-05-2017 10:37 2739776

Цитата:

Цитата greg zakharov
Iska, при перезаписи основного потока ADS затирается. »

Я не вижу этого у Вас в коде. Я вижу только:
Цитата:

Цитата greg zakharov
> out.txt »


greg zakharov 28-05-2017 07:36 2740199

Iska, очепятка. Бывает.

Iska 28-05-2017 07:59 2740204

greg zakharov, ясно. Бывает. Сам только вчера в выложенном коде по недосмотру отладочную строку оставил.

greg zakharov 28-05-2017 21:36 2740342

Iska, спасибо за проявленную бдительность.

Nike-jersey 06-06-2017 16:54 2742485

Цитата:

Цитата greg zakharov
@echo off
setlocal enabledelayedexpansion
@<my.xml>my.xml:s1 (for /f "delims=" %%i in ('more') do (
echo:"%%~i"|>nul findstr /irc:"office\\admin"&&(
set "s=%%~i"
echo !s:office\admin=Domain\User!
)||echo:%%~i
))&&(more < my.xml:s1 > my.xml)
endlocal
exit /b »

Спасибо за код, но по окончанию у меня строка меняется на
<UserId>Domain\User</UserId>

greg zakharov 07-06-2017 09:13 2742599

Цитата:

Цитата Nike-jersey
Спасибо за код, но по окончанию у меня строка меняется на
<UserId>Domain\User</UserId>

Как подсказывает капитан Очевидность нужно заменять Domain\User в коде самого бата на свои, а если это делать влом, то параметризируйте сам бат и будет Вам счастье. Прочие консультации только за деньги вопросы в том же духе умаляют энтузиазм, так что имейте в виду.


Время: 22:01.

Время: 22:01.
© OSzone.net 2001-