Использование переменных внутри PowerShell заменить - PullRequest
0 голосов
/ 01 мая 2018

Я пытаюсь добавить некоторые новые настройки в источник данных файла tomcat server.xml. Я могу сопоставить последний параметр в источнике данных, у которого есть пароль, который мне нужно записать, но когда я пытаюсь заменить его, я не вижу никаких изменений.

$serverXml = "C:\server.xml"
$xml = Get-Content $serverXml
$password = (($xml -match "                  password=""(.*)""").Replace('                  password="', "").Replace('"  />', ''))[0]
$oldString = @"
              username="cf.user"
              password="$password"  />
"@
$newString = @"
              username="cf.user"
              password="$password"
              testWhileIdle="true"
              testOnBorrow="true"
              testOnReturn="false"
              validationQuery="select 1"
              validationInterval="30000"
              minEvictableIdleTimeMillis="30000"  />
"@
$xml = $xml.replace($oldString, $newString)
Set-Content -Path $serverXml -Value $xml

Я могу в точности соответствовать $ password, но когда я использую его как переменную для передачи в $ oldString и $ newString при замене, это больше не соответствует. Даже $xml -match $oldString ничего не возвращает, но, насколько я могу судить, полностью должно.

Ответы [ 2 ]

0 голосов
/ 01 мая 2018

Не редактировать XML с помощью замены строк . Используйте бесплатный XML-парсер, который вам предоставляет PowerShell.

Загрузите файл конфигурации следующим образом:

[xml]$xml = Get-Content $serverXml

или как это:

$xml = New-Object Xml.XmlDocument
$xml.Load($serverXml)

Последний вариант немного более безопасен, потому что он (например) будет проверять, что кодировка файла действительно соответствует кодировке, указанной в преамбуле.

Выбор узлов с помощью выражений XPath :

$node = $xml.SelectSingleNode('/Path/To/Node')

Изменить существующие атрибуты следующим образом:

$node.Attributes['password'] = 'newpassword'

Добавить новые атрибуты, такие как:

$attr = $xml.CreateAttribute('testWhileIdle')
$attr.Value = 'true'
[void]$node.Attributes.Append($attr)

Затем сохраните измененный XML обратно в файл:

$xml.Save($serverXml)
0 голосов
/ 01 мая 2018

Надеюсь, это поможет вам начать

$currentpassword = "oldpasswr\nd" #current password
$currentpassword2 = [Regex]::Escape($currentpassword)
echo "escaped : $currentpassword2"


$changepassword = "newpasswor\nd"
$changepassword2 = [Regex]::Escape($changepassword)
echo "escaped $changepassword2"

$currentpassword2 = $currentpassword2.replace($currentpassword2, $changepassword2)
echo "$currentpassword2"

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

РЕДАКТИРОВАТЬ : отредактировано в соответствии с рекомендациями LotPings

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...