21. March 2019

ForEach

An dieser Nuss habe ich lange genagt… learning by doing… und immer mur Foo Bar, Foo Bar, Foo Bar… in jedem Codebeispiel… naja, ich mache es euch leichter.

Nehmen wir mal an, wir haben ein Array mit vielen Elementen darin. Z.B.:

$AllProcesses = Get-Process

Jetzt haben wir im Kapitel WHERE schon gelernt, dass man in solch einer „Liste“ auch mal von oben nach unten durchgehen muss und dabei jedes einzelne Element einmalig adressieren muss um irgendetwas damit zu tun. Genau diese sequentielle Adressierung passiert bei ForEach, bzw. ForEach-Object

Wir haben unsere Variable $AllProcesses. Um jetzt mit jedem dieser Elemente einmal etwas tun zu können, müssen wir dem Kind einen Namen geben. Einen x-beliebigen (außer den reservierten Namen natürlich). Dann geht PowerShell von oben nach unten durch und speichert dieses Element vorübergehend in einer Variablen die eben jeden x-beliebig ausgedachten Namen hat. Damit man diesen benutzen. Beispiel:

ForEach ($Process in $AllProcesses) {
Write-Host "Das ist der Prozess:"
   $Process
   Write-Host "-------------------------"
}


Nicht besonders einfallsreich, aber es hilft beim Verstehen. In der Regel würde man mit den einzelnen Werten was anderes machen wollen. Was auch immer dieses andere ist.

ForEach ($Process in $AllProcess) {
   Write-Host "Pozess $($Process.Name) belegt $($([math]::round(($Process.PagedSystemMemorySize / (1024 * 1024)),2))) MB im Pagefile."
}

Jetzt können wir also div. Operationen pro Zeile vornehmen, da wir das Kind beim Namen nennen können.

Hier noch ein ziemlich unsinniges Beispiel:

# Erstelle ein neues Array
$Table = @()
# Hole mir alles in $AllProcesses „wo“ der Name nicht svchost ist.
# Und gehe von darin von oben nach unten durch und adressiere jedes Element als $Process
ForEach ($Process in ($AllProcesses | ? {$_.Name -ne "svchost"})) {
   # Erstelle eine neue Variable mit Attributen
   $Line = "" | Select Name,PageMB
   # Fülle diese mit den gwünschten Werten
   $Line.Name = $Process.Name
   $Line.PageMB = [math]::round($Process.PagedSystemMemorySize / (1024 * 1024),2)

   # Füge die Zeile dem Array hinzu
   $Table += $Line
}

# Gebe das Array aus
$Table