PowerShell Workflow

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:

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

Die gesuchte Lösung noch nicht gefunden oder benötigen Sie Hilfe bei anderen Themen aus meinem Blog? Nehmen Sie gerne Kontakt mit mir bzw. meinem Unternehmen Jan Mischo IT auf. Ich freue mich auf Ihre Anfrage: https://janmischo.it/kontakt/


+49 2801 7004300

info@janmischo.it


Beitrag veröffentlicht

in

, ,

von

Schlagwörter:

Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.