2011-02-16 6 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로 업데이트 된 파일은 서식이 지정된 반면 원시 파일은 모두 공백없이 함께 묶여있는 것으로 나타났습니다.

이 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

글쎄, 나는 그것이 실제로 파일의 XML과 같은 _looks_ 만이 아닌 가능성이 있습니다 가정 (즉, 하이퍼이 차이를 만들 안된다 형식에 의해 방해된다.) 우리는 전후, XML을 볼 수 있을까요? 바이너리 편집기에서 파일을 살펴보고, PowerShell이 ​​유니 코드 BOM을 추가하지 않았는지 확인하거나, 혼란스러운 부분이 있는지 확인하십시오. –

+0

전체 XML 파일입니까? 그것들 모두 잘 구성된 XML이 아니기 때문에; 그들은'DECLGROUP'과'DECLARATIONS' 엘리먼트의 닫는 태그가 없습니다 ... –

+0

그들은 전체 파일이 아닙니다. 그것은 내가 바뀌고있는 태그의 끝에 이르는 파일의 시작입니다. 파일은 실제로 상당히 큽니다. 나는 거기에 복사 한 텍스트의 양을 최소화하고 싶었다. –

답변

0

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