PowerShell Loops und Array


Ein Array speichert mehrere Werte, Àhnlich einer 2 spaltigen Tabelle.

Beispiel

Als Beispiel könnten in einem Array 5 Werte eingetragen werden, diese können mittels ID wieder aufgerufen werden.

Hier ein einfaches Beispiel eines Arrays und deren gespeicherten Werte:

ID Wert
0 wert1
1 wert2
2 wert3
3 wert4
4 wert5

Beim Aufruf der ID 1 wĂŒrde bei Verwendung der Tabelle der Wert: "wert2" ausgegeben werden

Array

Das Erstellen eines Arrays funktioniert mit folgenden Befehl:

$array = @("wert1","wert2","wert3", "wert4", "wert5")

Die Werte können dann mit der ID 0- ... aufgerufen werden: $array[0], $array[1], ...

Die Ausgabe in Powershell erfolgt mittels "Write-Host":

$array = @("wert1","wert2","wert3", "wert4", "wert5")
Write-Host $array[0]
Result:
wert1

Die LĂ€nge des Arrays, also die Anzahl der gespeicherten Werte, kann mit $array.length ausgelesen werden

$array = @("wert1","wert2","wert3", "wert4", "wert5")
$array.length
Result:
5

Die gespeicherten Werte eines Array können zum Beispiel mittels Loop (Schleife) verarbeitet werden.

Die folgenden Schleifen (abgesehen von foreach) haben diese Gemeinsamkeit:

  • Eine Variable als ZĂ€hler ($i). Diese Variable dient zum ZĂ€hlen, wann die Schleife verlassen werden soll.
  • Dem ZĂ€hler wird ein Startwert zugewiesen ($i=0)
  • Der Startwert wird bei jedem Durchlauf der Schleife um 1 erhöht($i++)
  • bis der Endwert erreicht ist. Der Endwert ist die LĂ€nge des Array ($array.length)
  • FĂŒr die ÜberprĂŒfung des Endwert gibt es eine Bedingung: solange $i kleiner der Anzahl der Werte ($i -lt $array.length) siehe auch: PowerShell Syntax: vergleichen und verschachteln 

For Schleife (for loop)

Nehmen wir also obiges Beispiel, können wir mittels For-Schleife alle Werte im Array anzeigen lassen:

$array = @("wert1","wert2","wert3", "wert4", "wert5")
for ($i=0; $i -lt $array.length; $i++){
    Write-Host $array[$i]   
}
Result:
wert1
wert2
wert3
wert4
wert5

Der Befehl im Detail:

for ($i=0; $i -lt $array.length; $i++)

$i=0 ... Startwert: Die Variable $i startet mit dem Wert 0

$i -lt $array.length ... Bedingung: die For Schleife wird solange ausgefĂŒhrt, solange diese Bedingung erfĂŒllt ist: solange die Variable $i kleiner als $array.length ist, solange also $i kleiner 5 ist.

$i++ ... Aktion bei einem Durchlauf der Schleife: $i++ bedeutet den Wert der Variable $i um 1 erhöhen, bei jedem Durchlauf der Schleife wird $i um 1 grösser: 0 .. 1 .. 2 .. 3 ....

while Schleife (while loop)

Wir bleiben beim selben Beispiel mit einer while-Schleife.

$array = @("wert1","wert2","wert3", "wert4", "wert5")
$i=0
while ($i -lt $array.length){
   Write-Host $array[$i] 
   $i++
}
Result:
wert1
wert2
wert3
wert4
wert5

In dem Beispiel wird der Startwert $i vor der Schleife definiert ($i=0)

Der Befehl im Detail:

while ($i -lt $array.length){

Innerhalb von while (..  steht die Bedingung fĂŒr den Durchlauf der Schleife, solange diese erfĂŒllt ist, wird die Schleife nicht verlassen:

 $i -lt $array.length ... solange $i kleiner $array.length ist

Die Variable $i wird in diesem Beispiel innerhalb der Schleife jeweils um den Wert 1 erhöht: $i++

Endlosschleife -Endless Loop

while kann fĂŒr eine Endlosschleife folgendermaßen verwendet werden:

while($true) {
 #Script-Block
}

mit  break kann die Endlosschleife wieder verlassen werden. Folgendes Beispiel durchlĂ€uft die Schleife bis break ausgefĂŒhrt wird, dies passiert wenn $i nicht mehr kleiner 10 ist: 

$i=0
while($true) {
  $i++
  write-host $i
  if ($i -ge 10) {break}
}
Result:
1
2
3
4
5
6
7
8
9
10

do while Schleife (do loop)

$array = @("wert1","wert2","wert3", "wert4", "wert5")
$i=0
do{
   Write-Host $array[$i] 
   $i++
} while ($i -lt $array.length)
Result:
wert1
wert2
wert3
wert4
wert5

foreach

Foreach wird verwendet um alle vorhandenen Werte auszulesen. Foreach benötigt fĂŒr das AusfĂŒhren keinen Start und Endwert. Die Ausgelesenen Werte werden in einer Variable (im Beispiel: $i) gespeichert.

$array = @("wert1","wert2","wert3", "wert4", "wert5")
foreach ($i in $array){
   Write-Host $i 
}
Result:
wert1
wert2
wert3
wert4
wert5

 Der Befehl im Detail:

foreach ($i in $array) .. Aufruf aller Werte des Array($array). Die Variable $i enthÀlt bei jedem Durchlauf den aktuell ausgelesenen Wert.

foreach Pipe: | %

Bei Verwendung direkt in der Konsole, werden Befehle meist einfach ĂŒber eine Pipe "|" ĂŒbergeben: Mit einer Pipe kann das Array auch direkt an die Foreach-Schleife ĂŒbergeben werden. An dieser Stelle wird gerne das Alias % fĂŒr foreach verwendet:

PS C:\> @("wert1","wert2","wert3", "wert4", "wert5") | % { write-host $_ }
Result:
wert1
wert2
wert3
wert4
wert5

In der Schleife kann auf die Variable "$_" zugegriffen werden.

positive Bewertung({{pro_count}})
Beitrag bewerten:
{{percentage}} % positiv
negative Bewertung({{con_count}})

DANKE fĂŒr deine Bewertung!

Aktualisiert: 25.02.2022 von Bernhard 🔔


Top-Artikel in diesem Bereich


Windows PowerShell Skript erstellen und ausfĂŒhren
Im einfachsten Fall ist ein PowerShell-Skript eine Textdatei mit einer Reihe von PowerShell-Befehlen. Als PowerShell Skript versteht man eine Datei mit der Endung .ps1. Die Skriptdatei kann eine Sammlung von Befehlen, Funktionen oder Cmdlets enthalten.

Windows PowerShell Befehle: commands im Überblick
die verfĂŒgbaren PowerShell Befehle können mit dem Befehl:

PowerShell regex - EinfĂŒhrung und Beispiele
Regex kann in den meisten Skriptsprachen nahezu gleich verwendet werden, daher habe ich die Grundbegriffe und Funktionsweise in einem gesonderten Beitrag zusammengefasst, siehe Regex - Überblick. Dieser Beitrag beinhaltet SpezialiĂ€ten bei der Verwendung von Regex in PowerShell, sowie die Beispiele des Regex - Grundlagen Artikels.   Powershell: verschiedene Regex-Varianten PowerShell verfĂŒgt ĂŒber eigene Regex-Operatoren, als Beispiel: -match oder -replace. Nachdem Po...

Fragen / Kommentare


(sortiert nach Bewertung / Datum) [alle Kommentare(neueste zuerst)]

✍anonym
11.02.2016 09:58
User: Wittgenstein 
Interessant ist auch, dass man Arrays in eine foreach pipen kann:

$array | foreach { $_ }

ist das gleiche wie

foreach ($i in $array)
{
   $i
}

✍anonym
10.11.2015 14:44
User: vagabond3 
wĂ€re fĂŒr mich als blutigen anfĂ€nger schön, wenn ihr den code erstmal selbst testet, bevor ihr ihn online stellt...und der 2. nicht einfach den mist vom vorgĂ€nger ungeprĂŒft abkupfert... ;-P

↳
✍Bernhard
gepostet am 10.11.2015 14:44
FĂŒr mich wĂ€re 3. interessant was genau nicht funktioniert ;-P

Beitrag erstellt von Bernhard

✍anonym
22.03.2019 10:42
User: Micha 
Hallo, ich versuche verzweifelt nach einem Weg die kommastellen hochzuzÀhel, also 0.1/0.2 etc bis 10.
Hat jemand eine Idee?

$i = 0.1
While ($i -lt 10){$i + 0.1}

Ergebnis: endlosschlaufe 0.2
↳
✍anonym
gepostet am 15.04.2020 15:44
soweit ich das sehe zÀhlst Du $i zwar hoch, speicherst $i aber nicht mit dem neuen Wert. Deswegen bleibt es dann auch auf dem Ursprungswert.
Die Funktion ++ ist destruktiv, sie ĂŒberschreibt also den Eingangswert selbstĂ€ndig mit dem neuen Wert.

While ($i -lt 10){$i = $i + 0.1}

wĂŒrde klappen

Beitrag erstellt von anonym

✍anonym
12.12.2013 11:59
User: xermicus 
Einfacher geht die Abfrage er ein foreach-Konstrukt:

$array = @("wert1","wert2",wert3, "wert4", "wert5")
foreach ($item in $array)
{
write-host $item
}
↳
✍anonym
gepostet am 17.04.2020 13:25
Alles ohne foreach:
$array = @("wert1","wert2",wert3, "wert4", "wert5")
$array | % { write-host $_ }

Beitrag erstellt von anonym
↳
✍anonym
gepostet am 05.05.2020 05:51
Hallo,

Kurze Randbemerkung: 
% ist auch eine Foreach-Schleife, nur als Alias fĂŒr schreibfaule

Beitrag erstellt von anonym

✍anonym
11.01.2019 15:54
User: Khan 
Danke !!!

✍anonym
26.04.2016 14:53
User: PowerShell 
Funktioniert doch alles...
Aber bei der while Schleife wĂŒrde ich ein -lt statt -le verwenden.
Bei der Ausgabe wird am Ende (6. Durchlauf) eine Leerzeile durch das nicht vorhandene 6. Element erzeugt. Zum Verdeutlichen habe ich i mit ausgegeben.
Es stört hier nicht, alles ausgegeben werden soll, kann in anderen Szenarien aber zu Problemen fĂŒhren.

$i=0
while ($i -lt $array.length){
Write-Host $array[$i] 
$i
$i++
}
↳
✍Bernhard
gepostet am 26.04.2016 14:53
danke, habe ich ausgebessert

Beitrag erstellt von Bernhard