Heute ein kleiner Code-Schnipsel zum Thema „PowerShell Workflow“ zur Beschleunigung von PowerShell Scripten.
Das folgende PowerShell Script war der erste Ansatz um das DVD Laufwerk in allen VMs in unseren beiden Clustern zu entsorgen. Warum? Verbundene DVD Laufwerke oder auch gemountete Images können gerne Probleme verursachen. Da bei uns „lediglich“ Menschen arbeiten, wird nach einem Einsatz gerne vergessen, die DVD „zu entnehmen“ oder eben das Laufwerk aus der VM zu entfernen.
$Cluster = Get-Cluster
$ClusterHosts = $null
$ClusterHosts = Get-ClusterNode -Cluster $Cluster | where { $_.State -eq "Up" }
}
foreach($ClusterHost in $ClusterHosts){
$VMs = $(Get-VM -ComputerName $ClusterHost | where { $_.Generation -eq 2 -and $_.ReplicationMode -eq "None" -and $_.DVDDrives })
foreach($VM in $VMs){
Remove-VMDvdDrive -ComputerName $DVDDrive.ComputerName -VMName $DVDDrive.VMName -ControllerNumber $DVDDrive.ControllerNumber -ControllerLocation $DVDDrive.ControllerLocation
}
}
Dieser PowerShell Code-Schnipsel benötigt für unsere beiden Cluster mit insgesamt 11 Hosts knapp drei Minuten (2 Minuten und 40 Sekunden, um genau zu sein) und wurde mit „Measure-Command“ gemessen:
Measure-Command -Expression {
# Hier steht der PowerShell Code von oben :)
}
Für die Beschleunigung bedienen wir uns hier „einfach“ dem PowerShell Workflow, Parallel und ForEach Parallel:
- Workflow: https://docs.microsoft.com/en-us/powershell/scripting/developer/workflow/creating-a-workflow-by-using-a-windows-powershell-script?view=powershell-7
- PowerShell Parallel: https://docs.microsoft.com/en-us/powershell/module/psworkflow/about/about_parallel?view=powershell-5.1&viewFallbackFrom=powershell-7
- ForEach Parallel: https://docs.microsoft.com/en-us/powershell/module/psworkflow/about/about_foreach-parallel?view=powershell-5.1&viewFallbackFrom=powershell-7
Mit dem neuen, optimiertem Code-Ausschnitt beträgt die Laufzeit jetzt nur noch etwas mehr wie eine Minute. Und zwar 1:17:
$Cluster = Get-Cluster
workflow removeVMDVDDrives
{
Param(
[string[]]
$HyperVHosts
)
parallel {
foreach -parallel ($HyperVHost in $HyperVHosts) {
$VMs = Get-VM -ComputerName $HyperVHost | where { $_.Generation -eq 2 -and $_.ReplicationMode -eq "None" -and $_.DVDDrives }
foreach($VM in $VMs){
Write-Output "Entferne DVD aus VM $($VM.VMName)"
$DVDDrive = Get-VMDvdDrive -ComputerName $HyperVHost -VMName $VM.VMName
Remove-VMDvdDrive -ComputerName $DVDDrive.ComputerName -VMName $DVDDrive.VMName -ControllerNumber $DVDDrive.ControllerNumber -ControllerLocation $DVDDrive.ControllerLocation
}
}
}
return $results
}
[string[]]$ClusterHosts = @()
$ClusterHosts = Get-ClusterNode -Cluster $Cluster | where { $_.State -eq "Up" }
removeVMDVDDrives -HyperVHosts $ClusterHosts
Schreibe einen Kommentar