Редактирование XML с помощью PowerShell и ошибка «формат файла» - PullRequest
3 голосов
/ 16 февраля 2011

Я использую модуль HyperV из Codeplex для экспорта «только для конфигурации» с сервера Hyper-V 2008R2.Чтобы импортировать конфигурацию на другой сервер HyperV, мне нужно отредактировать значение CopyVMStorage в файле EXP.Этот файл является файлом XML.Я написал следующий код в PowerShell, чтобы сделать обновление для меня.Переменная $ существующие - это существующий файл 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 и использовать его для импорта конфигурации виртуальной машины?

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. Я считаю, что это скорее проблема кодирования / разработки, нежели вопрос ИТ-специалиста.

1 Ответ

0 голосов
/ 08 марта 2011

Создание экземпляра XmlTextWriter и установка для свойства «Форматирование» значения «Нет» должны выполнить то, что вы ищете. Вы можете попробовать что-то вроде этого и изменить в соответствии с вашими потребностями.

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()
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...