我正在尝试向tomcat server.xml文件数据源添加一些新设置。我可以匹配数据源中的最后一个设置,它具有我需要捕获的密码,但是当我尝试替换它时,我没有看到任何更改。
children: [
{
path: 'question',
component: viewComponent,
},
{
path: 'answer',
component: answerComponent,
},
]
我能够很好地匹配$ password,但是当我使用它作为变量传递给$ oldString和$ newString时,它不再匹配。即使$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
也没有返回任何内容,但完全应该尽我所知。
答案 0 :(得分:3)
Do not edit XML via string replacements。使用PowerShell为您提供的免费XML解析器。
像这样加载配置文件:
List<InputFormatter>
或者像这样:
[xml]$xml = Get-Content $serverXml
后者更加安全,因为它会(例如)检查文件的编码是否与前导码中指定的编码实际匹配。
通过XPath expressions选择节点:
$xml = New-Object Xml.XmlDocument
$xml.Load($serverXml)
更改现有属性:
$node = $xml.SelectSingleNode('/Path/To/Node')
添加如下新属性:
$node.Attributes['password'] = 'newpassword'
然后将修改后的XML保存回文件:
$attr = $xml.CreateAttribute('testWhileIdle')
$attr.Value = 'true'
[void]$node.Attributes.Append($attr)
答案 1 :(得分:-1)
希望这能让你开始
$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"
上面的代码片段说明了如何使用replace cmdlet切换到新密码
编辑:按照LotPings的建议进行编辑