Лучший отвечающий
Парсинг и модификация XML файла.

Вопрос
-
Добрый день. Описываю ситуацию. Скоро сменится сервер хранения логов. Вместо двух будет один другой.
Существует около сотни машин, на которых постоянно работают служебные програмыы, которые пишет 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
- Изменено Vector BCOModerator 24 июля 2017 г. 14:23
- Предложено в качестве ответа Vector BCOModerator 24 июля 2017 г. 14:36
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
- Изменено Vector BCOModerator 24 июля 2017 г. 14:38
24 июля 2017 г. 14:34Модератор