Restore VMs via PowerShell
Today I had the challenge to restore once a week multiple VMs that are used for VPN Client Testing.
I would like to share my script with you 😉
# Restore VMs for VPN Client Test #Load PS Modules Add-PSSnapin VMware.VimAutomation.Core Add-PSSnapin VeeamPSSnapin #Timer start $StartTime = Get-Date #Define Logging Vars $verboseLogFile = 'c:\temp\myReports\older-reports\Restore-VM-Log_' + (Get-Date -Format yyyy-MM-dd) + '.txt' $LastverboseLogFile = 'c:\temp\myReports\Restore-VM_latest.txt' Function My-Logger { param( [Parameter(Mandatory=$true)] [String]$message ) $timeStamp = Get-Date -Format "yyyy-MM-dd_HH:mm:ss" Write-Host -NoNewline -ForegroundColor White "[$timestamp]" Write-Host -ForegroundColor Green " $message" $logMessage = "[$timeStamp] $message" $logMessage | Out-File -Append -LiteralPath $verboseLogFile } #Start Processing ... My-Logger "Start VPN Client VMs restore" ##Connect Veeam & vCenter Server My-Logger "Connect vCenter Server" #Connect vCenter Server Connect-VIServer -server my-vCenterServer.mydomain.local My-Logger "Connect Veeam Server" #Connect Veeam Server Connect-VBRServer -Server my-VeeamServer.mydomain.local ## Define Vars $BackupName = "MyBackup-01" #Enter Backupname here My-Logger "Backup Name: $BackupName" $vmfolder = "MyVMFolder" #VMware Folder My-Logger "VMware Folder: $vmfolder" ## Fix Vars $vmarray = '@' #Create Array $vmarray = Get-VBRBackup -Name ($BackupName) | Get-VBRRestorePoint -Name * | select VmName #select VMs My-Logger "VMs to restore ..." $vmarray *>> $verboseLogFile # Loop through all of the array Items to perform Restore foreach ($vm in $vmarray) { # Get VMName from array $Name = $vm.VmName My-Logger "Restoreing VM: $Name" #Get a list of available restore points, select the last restore point and save it into a variable $RestorePoint = Get-VBRBackup -Name ($BackupName) | Get-VBRRestorePoint -Name ($Name) | select -Last (1) #Perform Restore of the VM: Start-VBRRestoreVM -RestorePoint ($RestorePoint) -Reason "Scheduled VPN Client VMs restore" -ToOriginalLocation -StoragePolicyAction Default } My-Logger "Restore Complete!" My-Logger "Poweron VMs ..." #Power On VMs $poweronvm = Get-Folder $vmfolder | Get-VM | Where-Object {$_.PowerState -eq 'PoweredOff'} $poweronvm *>> $verboseLogFile Start-VM -VM $poweronvm -Confirm:$false -RunAsync #Log powererd on VMs My-Logger "Show Poweredon VMs ..." Get-Folder $vmfolder | Get-VM *>> $verboseLogFile #Calculate Time $EndTime = Get-Date $duration = [math]::Round((New-TimeSpan -Start $StartTime -End $EndTime).TotalMinutes,2) My-Logger "StartTime: $StartTime" My-Logger " EndTime: $EndTime" My-Logger " Duration: $duration Minutes" My-Logger "Complete!" #Archive Copy-Item $verboseLogFile $LastverboseLogFile #Disconnect Disconnect-VIServer * -Confirm:$false Disconnect-VBRServer
The log would look like this:
[2016-12-16_14:16:19] Start VPN Client VMs restore [2016-12-16_14:16:19] Connect vCenter Server [2016-12-16_14:16:19] Connect Veeam Server [2016-12-16_14:16:19] Backup Name: MyBackup-01 [2016-12-16_14:16:19] VMware Folder: MyFolder [2016-12-16_14:16:19] VMs to restore ... VmName ------ My-TestVM01 My-TestVM02 My-TestVM03 [2016-12-16_14:16:19] Restoreing VM: My-TestVM01 [2016-12-16_14:22:15] Restoreing VM: My-TestVM02 [2016-12-16_14:33:36] Restoreing VM: My-TestVM03 [2016-12-16_14:42:54] Restore Complete! [2016-12-16_14:42:54] Poweron VMs ... Name PowerState Num CPUs MemoryGB ---- ---------- -------- -------- My-TestVM01 PoweredOff 2 8,000 My-TestVM02 PoweredOff 2 8,000 My-TestVM03 PoweredOff 2 8,000 [2016-12-16_14:42:57] Show Poweredon VMs ... Name PowerState Num CPUs MemoryGB ---- ---------- -------- -------- My-TestVM01 PoweredOn 2 8,000 My-TestVM02 PoweredOn 2 8,000 My-TestVM03 PoweredOn 2 8,000 [2016-12-16_14:42:59] StartTime: 12/16/2016 14:16:19 [2016-12-16_14:42:59] EndTime: 12/16/2016 14:42:59 [2016-12-16_14:42:59] Duration: 26.67 minutes [2016-12-16_14:42:59] Complete!
One thought on “Restore VMs via PowerShell”
Don’t know what you mean. Tell me how I could help.