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.