Export of Hyper-V/VMCX machines
This commit is contained in:
parent
d878f4dd8e
commit
872fc559f5
|
@ -288,6 +288,98 @@ func ExportVirtualMachine(vmName string, path string) error {
|
||||||
var script = `
|
var script = `
|
||||||
param([string]$vmName, [string]$path)
|
param([string]$vmName, [string]$path)
|
||||||
Export-VM -Name $vmName -Path $path
|
Export-VM -Name $vmName -Path $path
|
||||||
|
|
||||||
|
if (Test-Path -Path ([IO.Path]::Combine($path, $vmName, 'Virtual Machines', '*.VMCX')))
|
||||||
|
{
|
||||||
|
$vm = Get-VM -Name $vmName
|
||||||
|
$vm_adapter = Get-VMNetworkAdapter -VM $vm | Select -First 1
|
||||||
|
|
||||||
|
$config = [xml]@"
|
||||||
|
<?xml version="1.0" ?>
|
||||||
|
<configuration>
|
||||||
|
<properties>
|
||||||
|
<subtype type="integer">$($vm.Generation - 1)</subtype>
|
||||||
|
<name type="string">$($vm.Name)</name>
|
||||||
|
</properties>
|
||||||
|
<settings>
|
||||||
|
<processors>
|
||||||
|
<count type="integer">$($vm.ProcessorCount)</count>
|
||||||
|
</processors>
|
||||||
|
<memory>
|
||||||
|
<bank>
|
||||||
|
<dynamic_memory_enabled type="bool">$($vm.DynamicMemoryEnabled)</dynamic_memory_enabled>
|
||||||
|
<limit type="integer">$($vm.MemoryMaximum / 1MB)</limit>
|
||||||
|
<reservation type="integer">$($vm.MemoryMinimum / 1MB)</reservation>
|
||||||
|
<size type="integer">$($vm.MemoryStartup / 1MB)</size>
|
||||||
|
</bank>
|
||||||
|
</memory>
|
||||||
|
</settings>
|
||||||
|
<AltSwitchName type="string">$($vm_adapter.SwitchName)</AltSwitchName>
|
||||||
|
<boot>
|
||||||
|
<device0 type="string">Optical</device0>
|
||||||
|
</boot>
|
||||||
|
<secure_boot_enabled type="bool">False</secure_boot_enabled>
|
||||||
|
<notes type="string">$($vm.Notes)</notes>
|
||||||
|
<vm-controllers/>
|
||||||
|
</configuration>
|
||||||
|
"@
|
||||||
|
|
||||||
|
if ($vm.Generation -eq 1)
|
||||||
|
{
|
||||||
|
$vm_controllers = Get-VMIdeController -VM $vm
|
||||||
|
$controller_type = $config.SelectSingleNode('/configuration/vm-controllers')
|
||||||
|
# IDE controllers are not stored in a special XML container
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$vm_controllers = Get-VMScsiController -VM $vm
|
||||||
|
$controller_type = $config.CreateElement('scsi')
|
||||||
|
$controller_type.SetAttribute('ChannelInstanceGuid', 'x')
|
||||||
|
# SCSI controllers are stored in the scsi XML container
|
||||||
|
if ((Get-VMFirmware -VM $vm).SecureBoot -eq [Microsoft.HyperV.PowerShell.OnOffState]::On)
|
||||||
|
{
|
||||||
|
$config.configuration.secure_boot_enabled.'#text' = 'True'
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$config.configuration.secure_boot_enabled.'#text' = 'False'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$vm_controllers | ForEach {
|
||||||
|
$controller = $config.CreateElement('controller' + $_.ControllerNumber)
|
||||||
|
$_.Drives | ForEach {
|
||||||
|
$drive = $config.CreateElement('drive' + ($_.DiskNumber + 0))
|
||||||
|
$drive_path = $config.CreateElement('pathname')
|
||||||
|
$drive_path.SetAttribute('type', 'string')
|
||||||
|
$drive_path.AppendChild($config.CreateTextNode($_.Path))
|
||||||
|
$drive_type = $config.CreateElement('type')
|
||||||
|
$drive_type.SetAttribute('type', 'string')
|
||||||
|
if ($_ -is [Microsoft.HyperV.PowerShell.HardDiskDrive])
|
||||||
|
{
|
||||||
|
$drive_type.AppendChild($config.CreateTextNode('VHD'))
|
||||||
|
}
|
||||||
|
elseif ($_ -is [Microsoft.HyperV.PowerShell.DvdDrive])
|
||||||
|
{
|
||||||
|
$drive_type.AppendChild($config.CreateTextNode('ISO'))
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$drive_type.AppendChild($config.CreateTextNode('NONE'))
|
||||||
|
}
|
||||||
|
$drive.AppendChild($drive_path)
|
||||||
|
$drive.AppendChild($drive_type)
|
||||||
|
$controller.AppendChild($drive)
|
||||||
|
}
|
||||||
|
$controller_type.AppendChild($controller)
|
||||||
|
}
|
||||||
|
if ($controller_type.Name -ne 'vm-controllers')
|
||||||
|
{
|
||||||
|
$config.SelectSingleNode('/configuration/vm-controllers').AppendChild($controller_type)
|
||||||
|
}
|
||||||
|
|
||||||
|
$config.Save([IO.Path]::Combine($path, $vm.Name, 'Virtual Machines', 'box.xml'))
|
||||||
|
}
|
||||||
`
|
`
|
||||||
|
|
||||||
var ps powershell.PowerShellCmd
|
var ps powershell.PowerShellCmd
|
||||||
|
|
Loading…
Reference in New Issue