在applicationHost.config上执行Powershell替换会导致格式不正确的xml错误

时间:2018-07-23 10:29:24

标签: powershell iis windows-server-2016 iis-10

tl; dr;为什么以下脚本(replace.ps1)会导致IIS中xml格式错误,但手动执行却没有

我正在安装IIS 10的Windows Server 2016上运行以下脚本(replace.ps1),但是在错误消息“配置文件格式不正确的xml”错误后,它会导致所有powershell和gui配置更改,如果我手动进行相同的更改,则不会出错。

如果我打开了applicationHost.config的原始版本并将其与winmerge中更改后的版本进行比较,我可以看到更改的唯一一行是多余的部分标记,因此除非我缺少某些内容,否则似乎文件不太可能是其实不是很好。

顺便说一句,我认为可能是由于Out-File在文件的底部添加了换行符,所以我尝试添加-NoNewline参数,但是这导致它删除了所有现有的换行符,但仍然保留了换行符在$ newSection中,但是在查看原始配置后,无论如何它看起来都以换行符结尾,因此无论如何看起来都没关系。

replace.ps1

$newSection=@('<sectionGroup name="system.webServer">
            <section name="heliconZoo" overrideModeDefault="Allow" allowDefinition="Everywhere" />');
$schemaDir="$env:windir\system32\inetsrv\config\schema\";
$appHostFile="$env:windir\system32\inetsrv\config\applicationHost.config";
Copy-Item "./assets/heliconZoo_schema.xml" "$($schemaDir)";
Copy-Item "$appHostFile" "$appHostFile.bak";
(Get-Content $appHostFile ).Replace('<sectionGroup name="system.webServer">',$newSection) | Out-File $appHostFile # -NoNewline

我还认为这可能是由于使用了错误的处理模式/体系结构(有关详细信息,请参见here),但是我敢肯定我正在64位Powershell中运行脚本,并且如果我运行{ {1}}我看不到任何applicationHost.config文件,因此在32位进程中运行它无论如何都会失败。

2 个答案:

答案 0 :(得分:1)

Out-File的默认编码为encoding of the system's current ANSI code page

使用Out-File -Encoding ascii强制使用ASCII编码写入文件

答案 1 :(得分:1)

或者,将其强制转换为[System.Xml.XmlDocument](或[xml]),作为XML处理并使用XML编写器进行写出,该编写器的主要特征是将编码声明与实际使用的编码进行匹配。

请参见艾恩·布莱顿的这段简短tutorial

简介:

$fileName = "employees.xml";
$xmlDoc = [System.Xml.XmlDocument](Get-Content $fileName);

$newXmlEmployee = $xmlDoc.employees.AppendChild($xmlDoc.CreateElement("employee"));
# …

$xmlDoc.Save($fileName);