我正在使用Codeplex的HyperV模块从2008R2 Hyper-V服务器执行“仅配置”导出。为了在另一个HyperV服务器上导入配置,我需要在EXP文件中编辑CopyVMStorage的值。该文件是XML文件。我在PowerShell中编写了以下代码来为我做更新。变量$ existing是现有的exp文件。
$xml = [xml](get-content $existing)
$xpath = '//PROPERTY[@NAME ="CopyVmStorage"]'
foreach ($node in $xml.SelectNodes($xpath))
{$node.Value = 'TRUE'}
$xml.Save($existing)
此代码对XML进行了正确的更改。但是,当我在Hyper-V服务器上导入文件时,出现“文件格式不正确”的错误。我想知道文件的编码是否不正确或是否还有其他事情发生。如果我在wordpad中手动编辑文件,则导入时没有问题。
我注意到使用PowerShell更新的文件是格式化的,而原始文件是xml,所有这些文件都没有空白。
关于“文件格式”在此HyperV错误消息中可能含义的任何想法以及我如何能够使用我的代码在XML中自动执行此更改并能够使用它来导入VM配置?
XML之前
<?xml version="1.0" encoding="UTF-16" standalone="yes"?>
<DECLARATIONS>
<DECLGROUP>
<VALUE.OBJECT><INSTANCE CLASSNAME="Msvm_VirtualSystemExportSettingData"><PROPERTY NAME="Caption" TYPE="string"><VALUE>Virtual System Export Setting Data</VALUE></PROPERTY><PROPERTY NAME="CopySnapshotConfiguration" TYPE="uint8"><VALUE>0</VALUE></PROPERTY><PROPERTY NAME="CopyVmRuntimeInformation" TYPE="boolean"><VALUE>FALSE</VALUE></PROPERTY><PROPERTY NAME="CopyVmStorage" TYPE="boolean"><VALUE>FALSE</VALUE></PROPERTY><PROPERTY NAME="CreateVmExportSubdirectory" TYPE="boolean"><VALUE>TRUE</VALUE></PROPERTY><PROPERTY NAME="Description" TYPE="string"><VALUE>Microsoft Virtual System Export Setting Data</VALUE></PROPERTY><PROPERTY NAME="ElementName" TYPE="string"><VALUE>Microsoft Virtual System Export Setting Data</VALUE></PROPERTY><PROPERTY NAME="InstanceID" TYPE="string"><VALUE>Microsoft:A1F914F2-F38E-48A6-B1EE-58B84ECEAC0C</VALUE></PROPERTY><PROPERTY NAME="SnapshotVirtualSystem" TYPE="string"></PROPERTY></INSTANCE>
</VALUE.OBJECT>
XML After
<?xml version="1.0" encoding="UTF-16" standalone="yes"?>
<DECLARATIONS>
<DECLGROUP>
<VALUE.OBJECT>
<INSTANCE CLASSNAME="Msvm_VirtualSystemExportSettingData">
<PROPERTY NAME="Caption" TYPE="string">
<VALUE>Virtual System Export Setting Data</VALUE>
</PROPERTY>
<PROPERTY NAME="CopySnapshotConfiguration" TYPE="uint8">
<VALUE>0</VALUE>
</PROPERTY>
<PROPERTY NAME="CopyVmRuntimeInformation" TYPE="boolean">
<VALUE>FALSE</VALUE>
</PROPERTY>
<PROPERTY NAME="CopyVmStorage" TYPE="boolean">
<VALUE>TRUE</VALUE>
</PROPERTY>
<PROPERTY NAME="CreateVmExportSubdirectory" TYPE="boolean">
<VALUE>TRUE</VALUE>
</PROPERTY>
<PROPERTY NAME="Description" TYPE="string">
<VALUE>Microsoft Virtual System Export Setting Data</VALUE>
</PROPERTY>
<PROPERTY NAME="ElementName" TYPE="string">
<VALUE>Microsoft Virtual System Export Setting Data</VALUE>
</PROPERTY>
<PROPERTY NAME="InstanceID" TYPE="string">
<VALUE>Microsoft:A1F914F2-F38E-48A6-B1EE-58B84ECEAC0C</VALUE>
</PROPERTY>
<PROPERTY NAME="SnapshotVirtualSystem" TYPE="string">
</PROPERTY>
</INSTANCE>
</VALUE.OBJECT>
注意:这是来自https://serverfault.com/questions/231186/code-to-update-hyperv-export-file的交叉帖子。我相信这实际上更像是编码/开发问题,而不是IT专业人士的问题。
答案 0 :(得分:0)
实例化XmlTextWriter并将Formatting属性设置为“None”应该可以完成您要查找的内容。您可以尝试这样的事情并根据您的具体需求进行修改。
function NoFormat-XML ([xml]$xml)
{
$StringWriter = New-Object System.IO.StringWriter
$XmlWriter = New-Object System.XMl.XmlTextWriter $StringWriter
$xmlWriter.Formatting = "None"
$xml.WriteContentTo($XmlWriter)
$XmlWriter.Flush()
$StringWriter.Flush()
Write-Output $StringWriter.ToString()
}