Powershell Set-Content如何替换多行

时间:2017-10-24 11:30:18

标签: xml powershell

我有以下PowerShell脚本(我正在使用Powershell v5.1),我在上一篇文章中主要采用了这个脚本:Replace multiline text in a file using Powershell without using Regex

$oldCode =  @"
        <httpProtocol>
            <customHeaders>
                <clear />
            </customHeaders>
            <redirectHeaders>
                <clear />
            </redirectHeaders>
        </httpProtocol>
"@

$newCode = @"
        <httpProtocol>
            <customHeaders>
                <add name="X-Frame-Options" VALUE="SAMEORIGIN"></add>
            </customHeaders>
            <redirectHeaders>
                <clear />
            </redirectHeaders>
        </httpProtocol>
"@

$Path = "c:\Windows\System32\inetsrv\config\applicationHost.config"
$Content = (Get-Content $Path -Raw).replace($oldCode,$newCode)

Set-Content -Path $Path -Value $Content -Verbose

但是,这并不能取代$ oldCode。我已经使用Write-Output检查$ Content变量并且它没有替换字符串,所以我假设它是匹配字符串或替换命令本身的问题,而不是Set-Content命令的问题

有关如何使其发挥作用的任何想法?

1 个答案:

答案 0 :(得分:0)

所以最后,我使用了以下内容。这不是您可以使用API​​构建元素的唯一选项。

$xmlPath = "c:\windows\system32\inetsrv\config\applicationHost.config"

[xml]$xml = Get-Content -Path $xmlPath

[xml]$xFrameXml = @"
            <customHeaders>
                <add name="X-Frame-Options" value="SAMEORIGIN" />
            </customHeaders>
"@

foreach($node in $xml.SelectNodes('/configuration/system.webServer/httpProtocol/customHeaders')){
    $node.ParentNode.AppendChild($xml.ImportNode($xFrameXml.customHeaders, $true));
    $node.ParentNode.RemoveChild($node);

}
$xml.Save($xmlPath);

您也可以使用.ReplaceChild,但我没有找到正确的语法,所以如果有人这样做可能会更清晰。

感谢Ansgar指出我正确的方向。