在PowerShell中使用变量替换

时间:2018-05-01 20:25:55

标签: powershell

我正在尝试向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 也没有返回任何内容,但完全应该尽我所知。

2 个答案:

答案 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的建议进行编辑