-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathvmfuncs.psm1
More file actions
159 lines (141 loc) · 5.41 KB
/
vmfuncs.psm1
File metadata and controls
159 lines (141 loc) · 5.41 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
function Save-VM
{
<#
.SYNOPSIS
Speichert eine VM ähnlich Export-VM. Export-VM ist natürlich vorzuziehen. Allerdings erwartet Export-VM
auf einer Freigabe, das Hyper-V Computerkonto. Save-VM arbeitet mit den Rechten des aktuell angemeldeten
Benutzer.
.DESCRIPTION
Speichert die Dateien einer VM in einen definierten Zielordner. Existiert der Ordner am
definierten Ziel nicht, wird der Ordner erstellt. Durch Verwendung des Schalterparameter Override
werden bereits existierende Dateien überschrieben.
.PARAMETER Path
Legt den Zielordner fest.
.PARAMETER Name
Der Name der zu sichernden VM
.PARAMETER Override
Durch Override werden ggf. vorhandene Dateien überschrieben
.PARAMETER TurnOff
Durch den Schalter TurnOff wird das Ausschalten der Machine erzwungen.
Vorsicht: Hierbei kann es zu Datenverlusten kommen.
.EXAMPLE
Save-VM -VMName s2k12 -Path \\NAS\VMs\S2K12 -Override
.NOTES
.LINK
#>
param(
[Parameter(Mandatory=$true)]
[String] $Name,
[Parameter(Mandatory=$true)]
[String] $Path,
[Switch] $Override = $false,
[Switch] $TurnOff = $false
)
$vm = Get-VM $Name -ErrorAction SilentlyContinue
if($null -eq $vm)
{
Write-Error "Virtuelle Maschine nicht gefunden!"
return
}
# VMState der virtuellen Maschine ermitteln
$vmState = $vm.State
# Files der Laufwerke ermitteln
$hds = $vm.HardDrives
$sources = $hds.Path
foreach($vhdFile in $sources)
{
$result = Test-Path $path
if($result -eq $false)
{
New-Item $path -ItemType Directory -ErrorAction SilentlyContinue
$result = Test-Path $path
if($result -eq $false)
{
Write-Error -Message "Der Zielpfad existiert nicht!"
return
}
}
# Ist das File der virtuellen Festplatte erreichbar?
$result = Test-Path $vhdFile
if($result -eq $false)
{
Write-Error -Message "$vhdFile nicht gefunden!"
}
# Vor dem Kopieren, wird geprüft, ob die Datei bereits existiert
$items = $vhdFile.Split('\')
$fileName = $items[$items.Length-1]
$filePath = $path + '\' + $fileName
$exist = Test-Path $filePath
if($exist -eq $false -or $Override -eq $true)
{
# Wenn die virtuelle Maschine läuft, wird diese gestoppt
if($vmState -ne "Off")
{
Write-Verbose "Es wird versucht, die virtuelle Maschine herunterzufahren."
$result = Stop-VM -Name $Name -Confirm:$true
if($null -eq $result)
{
if($TurnOff -eq $true)
{
$null = Stop-VM -Name $Name -TurnOff
}
}
if((Get-VM $Name).State -ne "Off")
{
Write-Error "Virtuelle Maschine konnte nicht heruntergefahren werden!"
return
}
else {
Write-Verbose "Virtuelle Maschine wurde heruntergefahren."
}
}
Start-BitsTransfer -Source $vhdFile -Destination $path -Description $vhdFile -DisplayName "Backup"
}
elseif($exist -eq $true)
{
Write-Error "Datei wurde nicht kopiert da bereits eine Datei mit gleichem Namen am Speicherort vorhanden ist."
Write-Verbose "$filePath bereits vorhanden. Verwenden sie den Schalter -Override um vorhandene Dateien zu überschreiben."
return
}
}
# Prüfung, ob ggf. Snapshots existieren
$snapShots = Get-VMSnapshot -VMName $Name
if($null -ne $snapShots)
{
Write-Verbose "Snapshots vorhanden."
$snapShotHDs = $snapShots.HardDrives
#$snapShotSources = $snapShots.Path
foreach ($snapShotSource in $snapShotHDs)
{
$snapShotPath = $snapShotSource.Path
$result = Test-Path $snapShotPath
if($result -eq $false)
{
Write-Error -Message "$snapShotPath nicht gefunden!"
break
}
# Vor dem Kopieren, wird geprüft, ob die Datei bereits existiert
$items = $snapShotPath.Split('\')
$fileName = $items[$items.Length-1]
$filePath = $path + '\' + $fileName
$exist = Test-Path $filePath
if($exist -eq $false -or $Override -eq $true)
{
Write-Verbose "$snapShotPath wird kopiert."
Start-BitsTransfer -Source $snapShotPath -Destination $path -Description $snapShotPath -DisplayName "Backup"
}
elseif($exist -eq $true)
{
Write-Verbose "$filePath bereits vorhanden. Verwenden sie den Schalter -Override um vorhandene Dateien zu überschreiben."
}
}
}
finally {
# Wenn die Maschine vor dem Sichern gelaufen ist, wird diese wieder gestartet
if($vmState -eq "Running")
{
Write-Verbose "Die virtuelle Maschine wird gestartet."
Start-VM -Name $vm.Name
}
}
}