【发布时间】:2011-06-28 12:16:03
【问题描述】:
我正在使用 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 服务器上导入文件时,我收到一条错误消息,提示“文件格式不正确”。我想知道文件的编码是否不正确,或者是否还有其他事情发生。如果我在写字板中手动编辑文件,它会毫无问题地导入。
我注意到使用 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 之后
<?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 专业人士的问题。
【问题讨论】:
-
好吧,我想文件可能看起来像 XML 但实际上不是(即 HyperV 被不应该产生影响的格式所困扰。)我们可以看到 XML,之前和之后?您能否在二进制编辑器中查看文件,确保 PowerShell 没有添加 Unicode BOM 或其他任何可能造成混淆的东西?
-
这些是整个 XML 文件吗?因为这些都不是格式良好的 XML;他们缺少
DECLGROUP和DECLARATIONS元素的结束标签... -
它们不是整个文件。它是文件的开头,一直到我要更改的
标记的结尾。这些文件实际上相当大。我想尽量减少我在那里复制的文本量。 -
我查看了二进制编辑器,文件的开头或结尾似乎没有任何奇怪的地方,无论是之前还是之后
-
在二进制编辑器(或使用 PSCX 的 Format-Hex)中,您应该看到前两个字节是:
FF FE。您可以通过使用像 Notepad2 这样的编辑器来实现这一点,它可以让您选择要使用的文件编码。
标签: xml encoding powershell