none
Парсинг и модификация XML файла. RRS feed

  • Вопрос

  • Добрый день. Описываю ситуацию. Скоро сменится сервер хранения логов. Вместо двух будет один другой.

    Существует около сотни машин, на которых постоянно работают служебные програмыы, которые пишет 24/7 логи. Каждый день эти логи собираются и разбрасываются на 2 сервера их хранения. Откда брать, куда класть и что дописывать указано в утилитке для архивирования и перемещения в виду XML. Сам файл выглядит примерно так:

    <?xml version="1.0" encoding="Windows-1251"?>
     <root>
      <param Indir="C:\служенбая служба 1\logs" OutDir="\\log1\public\служебные архивы\" Prefix="1server_"></param>
      <param Indir="C:\служенбая служба для тети Гали\logs" OutDir="\\log2\public\Отчётова Галина Бухгалтеровна\" Prefix="1server_"></param>
      <param Indir="C:\служенбая служба 3\logs" OutDir="\\log1\public\служебные архивы\" Prefix="1server_"></param>
      <param Indir="C:\другая служенбая служба\logs" OutDir="\\log2\public\другое\" Prefix="1server_"></param>
      <param Indir="C:\служенбая служба 5\logs" OutDir="\\log1\public\служебные архивы\" Prefix="1server_"></param>
    </root>

    И когда сервер станет один "log1" и "log2" надо будет заменить на "one" - \\one\public\...

    И вот в чём вопрос. Я несколько дней шарю в интернете полезные гайды по модификации XML-файлов. Парсить его я умею и в разных позах, но заменить содержимое не могу.

    Перепробовал кучу вариантов и через $XPath и через .node и через InnerText и что-то ещё совсем индусское было. В сердцах стёр последнии мои мытарства, да и прикладывать нечего.

    Подскажите, как мне вставить строк в OutDir. Модифицирую я через:

    $Path = "C:\Test\Archiv_Docs_settings.xml"
    $XML= [xml](Get-Content $Path)
    $XML.Root.Param.Outdir.Replace("Log1", "One")
    

    Если в конце вставить $XML.Save ничего он не вносит, файл перезаписывает, но и всё.

    Если попытаться через - то тоже глухо. Нужен совет куда смотреть, что понять.

    $XML.Root.Param.Outdir = $XML.Root.Param.Outdir.Replace("Log1", "One")

    24 июля 2017 г. 14:00

Ответы

  • Replace("Log1","One") - регистрозависим, Log1 и log1 две разных строки.

    $XML.Root.Param | Foreach {$_.Outdir = $_.OutDir -replace "Log[12]","One"}
    $XML.Save($Path)



    • Изменено KazunEditor 24 июля 2017 г. 14:16
    • Помечено в качестве ответа Setteor 24 июля 2017 г. 14:27
    24 июля 2017 г. 14:13
    Отвечающий

Все ответы

  • $(get-content c:\config.xml) -replace '\\\\log[12]\\','\\One\' | set-content c:\config_new.xml


    The opinion expressed by me is not an official position of Microsoft


    24 июля 2017 г. 14:05
    Модератор
  • Replace("Log1","One") - регистрозависим, Log1 и log1 две разных строки.

    $XML.Root.Param | Foreach {$_.Outdir = $_.OutDir -replace "Log[12]","One"}
    $XML.Save($Path)



    • Изменено KazunEditor 24 июля 2017 г. 14:16
    • Помечено в качестве ответа Setteor 24 июля 2017 г. 14:27
    24 июля 2017 г. 14:13
    Отвечающий
  • Replace("Log1","One") - регистрозависим, Log1 и log1 две разных строки.

    $XML.Root.Param | Foreach {$_.Outdir = $_.OutDir -replace "Log[12]","One"}
    $XML.Save($Path)



    Как оказалось нет. Что меня немного удивляет. При учете больших буков в коде, другие не пробовал - заменил и вариант с малым регистром, и с большим. Перепроверил несколько раз.

    Я немного модифицировал, чтобы он сразу оба варианта заменял. Но спасибо большое, очень помогли. Всё оказалось немного проще, в моих прошлых экспериментах я где-то изменил переменную SilentlyError и не видел ошибок, о чем забыл и ПоШ не выключал. Может быть и раньше смог сообразить:D

    Конечный вариант выглядит так:

    $Path = "C:\Test\Archiv_Docs_settings.xml"
    $XML= [xml](Get-Content $Path)
    $XML.Root.Param | Foreach {$_.OutDir = $_.OutDir -replace "LOG[1,2]", "ONE"}
    $XML.Save($Path)

    Ещё раз спасибо.


    24 июля 2017 г. 14:32
  • Я немного модифицировал, чтобы он сразу оба варианта заменял. Но спасибо большое, очень помогли. Всё оказалось немного проще, в моих прошлых экспериментах я где-то изменил переменную SilentlyError и не видел ошибок, о чем забыл и ПоШ не выключал. Может быть и раньше смог сообразить:D

    Конечный вариант выглядит так:

    $Path = "C:\Test\Archiv_Docs_settings.xml"
    $XML= [xml](Get-Content $Path)
    $XML.Root.Param | Foreach {$_.OutDir = $_.OutDir -replace "LOG[1,2]", "ONE"}
    $XML.Save($Path)

    Ещё раз спасибо.


    Плохо заменили :-)

    в вашем случае log[12] ~ log[1,2]

    То что находится в [] перебирается посимвольно как возможные варианты [12] означает 1 или 2; [1,2] - 1 или 2 или запятая


    The opinion expressed by me is not an official position of Microsoft

    24 июля 2017 г. 14:34
    Модератор