tl; dr;为什么以下脚本(replace.ps1)会导致IIS中xml格式错误,但手动执行却没有
我正在安装IIS 10的Windows Server 2016上运行以下脚本(replace.ps1),但是在错误消息“配置文件格式不正确的xml”错误后,它会导致所有powershell和gui配置更改,如果我手动进行相同的更改,则不会出错。
如果我打开了applicationHost.config的原始版本并将其与winmerge中更改后的版本进行比较,我可以看到更改的唯一一行是多余的部分标记,因此除非我缺少某些内容,否则似乎文件不太可能是其实不是很好。
顺便说一句,我认为可能是由于Out-File在文件的底部添加了换行符,所以我尝试添加-NoNewline参数,但是这导致它删除了所有现有的换行符,但仍然保留了换行符在$ newSection中,但是在查看原始配置后,无论如何它看起来都以换行符结尾,因此无论如何看起来都没关系。
$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位进程中运行它无论如何都会失败。
答案 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);