使用PowerShell编辑XML并出现“文件格式”错误

时间:2011-02-16 16:49:41

标签: xml encoding powershell

我正在使用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专业人士的问题。

1 个答案:

答案 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()
}