Manchmal brauche ich zur Entwicklung mehrere virtuelle Maschinen, die erst zusammen ein brauchbares Entwicklungssystem ergeben, beispielsweise eine gesamte kleine Domäne. In diesem Fall müssen bestimmte Rechner in einer vordefinierten Reihenfolge gestartet werden. Da ich keinen großen Hyper-V-Host habe, sondern meine virtuellen Maschinen auf mehrere Hyper-V-Hosts verteilt habe und ich nicht manuell alle virtuellen Maschinen starten möchte, starte ich diese über ein powershell-Script, dass die VMs in einer vordefinierten Reihenfolge ($VMNames) auf den unterschiedlichen Hyper-V Hosts ($VMHostServers) startet.

In diesem Skript:

  • Zwei Arrays definieren die zu überprüfenden Hyper-V-Hosts ($VMHostServers) und virtuellen Maschinen ($VMNames).
  • Das Skript durchläuft jede VM in $VMNames und überprüft auf jedem Server in $VMHostServers, ob die VM vorhanden und gestartet ist.
  • Es wird zunächst die Verfügbarkeit jedes Servers überprüft.
  • Für verfügbare Server wird dann überprüft, ob die VM existiert. Falls ja, wird geprüft, ob sie bereits läuft.
  • Falls die VM nicht läuft, wird sie gestartet.
# Definiert eine Liste von Hyper-V-Servern und VM-Namen
$VMHostServers = "HyperV-1", "HyperV-2", "HyperV-3", "HyperV-4"
$VMNames = "Dev1-DC", "Dev1-SQL2012", "Dev1-SP2013", "Dev1-Win8", "Dev1-Win7"
# Durchläuft alle VM-Namen
ForEach ($VMName in $VMNames) {
Write-Host "$VMName" -BackgroundColor Yellow
# Durchläuft alle Hyper-V-Server
ForEach ($VMHostServer in $VMHostServers) {
Write-Host "Überprüfe, ob VM $VMName auf Server $VMHostServer enthalten ist"
# Überprüft, ob der Hyper-V-Server verfügbar ist
if (Test-Connection -ComputerName $VMHostServer -Count 1 -Quiet -EA 0) {
Write-Host "Server $VMHostServer verfügbar" -ForegroundColor Green
# Überprüft, ob die VM auf dem Server vorhanden ist
if (Get-VM -ComputerName $VMHostServer | Where-Object { $_.Name -eq $VMName }) {
Write-Host "gefunden: $VMName" -ForegroundColor Green
# Überprüft, ob die VM bereits läuft
if (Get-VM -ComputerName $VMHostServer | Where-Object { $_.State –eq 'Running' -and $_.Name -eq $VMName }) {
Write-Host "$VMName läuft bereits"
} else {
Write-Host "$VMName wird gestartet"
# Startet die VM, falls sie nicht bereits läuft
Start-VM $VMName -ComputerName $VMHostServer
}
} else {
Write-Host "$VMName auf $VMHostServer nicht gefunden" -ForegroundColor Yellow
}
} else {
Write-Host "Server $VMHostServer NICHT verfügbar" -ForegroundColor Red
}
}
}

Das Ganze gibt es auch als Programm:

Download