2011-02-16 51 views
3

我使用Codeplex的HyperV模塊從2008R2 Hyper-V服務器執行「僅配置」導出。爲了在另一個HyperV服務器上導入配置,我需要在EXP文件中編輯CopyVMStorage的值。這個文件是一個XML文件。我在PowerShell中編寫了以下代碼來爲我執行更新。變量$ existing是現有的exp文件。使用PowerShell和「文件格式」錯誤編輯XML

$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 Pro問題。

+0

嗯,我想這可能是文件_looks_如XML,但實際上不是(即Hyper-V的被格式化,不應該有所作爲了。)我們可以看到XML,前後?你可以看看二進制編輯器中的文件,確保PowerShell不添加Unicode BOM或其他任何可能會令人困惑的東西嗎? – 2011-02-16 16:59:26

回答

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