我有以下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命令的问题
有关如何使其发挥作用的任何想法?
答案 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指出我正确的方向。