Para quem possa interessar, deixo aqui este script muito xungoso para fazer backups de VMs Hyper-V :o)A ideia aqui é desligar as máquinas, copiar os virtual disks e as configurações das virtual machines e ligar as VMs de volta.
File doBackup.bat:
@echo off
echo ############# Starting backup for %DATE%
echo Stopping vms...
shutdown /s /m \\primavera /t 0
shutdown /s /m \\sqlserver /t 0
echo Waiting 30 seconds for machines to shutdown...
ping -n 30 localhost > nul
echo Creating Z:\VMs\%DATE%\
md Z:\VMs\%DATE%
echo Backing up vm...
xcopy V:\*.* Z:\VMs\%DATE% /E /C /Q /Y
echo Backup finished!
echo Starting vms...
manageVms primavera start
manageVms sqlserver start
echo ############# Ending backup for %DATE%
File manageVms.vbs:
Option Explicit
Dim WMIService
Dim VMList
Dim VMName
Dim VMOp
If (WScript.Arguments.Count <>
WScript.Quit 1
Else
'Specify the name of the virtual machine that I want to start
VMName = WScript.Arguments(0)
Select Case WScript.Arguments(1)
case "start"
VMOp=2
case "stop"
VMOp=3
case "save"
VMOp=32769
case else
MsgBox "Please select start, stop or save",0,"Bad parameter caught!"
WScript.Quit 1
End Select
'Get instance of 'virtualization' WMI service on the local computer
Set WMIService = GetObject("winmgmts:\\.\root\virtualization")
'Query for the specific virtual machine that I want to start
Set VMList = WMIService.ExecQuery("SELECT * FROM Msvm_ComputerSystem WHERE ElementName='" & VMName & "'")
' Request a state change on the first VM that is returned
' 2 = start, 3 = stop and 32769 = save state
VMList.ItemIndex(0).RequestStateChange(VMop)
End if
WScript.Quit 0
Como podem ver, o script manageVms.vbs permite fazer start, stop ou suspend a VMs mas, infelizmente, o stop faz mesmo "power off" à VM (ou seja, não recorre aos Integration Services para fazer um shutdown limpo)...
Pelo que vi na documentação da API WMI do Hyper-V, como não existe um método para fazer um shutdown "limpo", optei por desligar as máquinas recorrendo ao comando "shutdown": simples e eficaz!
O "ping" ao localhost é apenas uma forma simples de fazer uma espécie de "sleep" (já que, tanto quanto sei, não existe forma de fazer pause à execução de um script durante um determinado número de segundos :oP).
É claro que o melhor seria mesmo desenvolver um script para pesquisar o estado da VM e só avançar quando ela esteja REALMENTE desligada!
No meu caso, as VMs que correm na máquina onde fiz este script demoram cerca de 5/10 segundos a desligar pelo que 30 segundos é mais que suficiente!
Escusado será dizer que as VMs e os seus discos virtuais estão, neste caso, alojados no disco V:\ .
Como o xcopy pode enviar mensagens de erro da cópia para o stderr, é aconselhado executar o script doBackup da seguinte forma:
Z:\BackupScripts\doBackup.bat 1>>backup.log 2>&1
Enjoy! ;o)































