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[0]

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

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:

for ($i=0; $i -lt $array.length; $i++){
    Write-Host $array[$i]   
}

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.

$i=0
while ($i -lt $array.length){
   Write-Host $array[$i] 
   $i++
}

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

 

do while Schleife (do loop)

$i=0
do{
   Write-Host $array[$i] 
   $i++
} while ($i -lt $array.length)

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.

foreach ($i in $array){
   Write-Host $i 
}

 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:\Users>@("wert1","wert2","wert3", "wert4", "wert5") | % { write-host $_ }
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!


veröffentlicht am 21.03.2013 von Bernhard
geändert am 11.11.2020 von Bernhard



Fragen / Kommentare


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

✍anonym
erstellt am 10.11.2015 15:11
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
erstellt am 10.11.2015 15:11
Für mich wäre 3. interessant was genau nicht funktioniert ;-P

erstellt von Bernhard

✍anonym
erstellt am 22.03.2019 11:03
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
erstellt am 15.04.2020 17:04
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

erstellt von anonym

✍anonym
erstellt am 11.01.2019 16:01
User: Khan 
Danke !!!

✍anonym
erstellt am 26.04.2016 16:04
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
erstellt am 26.04.2016 16:04
danke, habe ich ausgebessert

erstellt von Bernhard

✍anonym
erstellt am 11.02.2016 10:02
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
erstellt am 12.12.2013 12:12
User: xermicus 
Einfacher geht die Abfrage er ein foreach-Konstrukt:

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

erstellt von anonym
✍anonym
erstellt am 05.05.2020 07:05
Hallo,

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

erstellt von anonym

Wir verwenden Cookies, um Inhalte und Anzeigen zu personalisieren, Funktionen für soziale Medien anbieten zu können und die Zugriffe auf unsere Website zu analysieren. Außerdem geben wir Informationen zu Ihrer Nutzung unserer Website an unsere Partner für soziale Medien, Werbung und Analysen weiter. Details anzeigen.