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!

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
11.01.2019 15:54
User: Khan 
Danke !!!

✍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
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