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


Top-Artikel in diesem Bereich

Preview Windows PowerShell Skript erstellen und ausführen

Windows PowerShell Skript erstellen und ausführen

geändert: 08.09.2021 von Bernhard (Erstveröffentlichung: 28.11.2012)

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. ... weiterlesen

Preview Windows PowerShell Befehle: commands im Überblick

Windows PowerShell Befehle: commands im Überblick

geändert: 12.09.2017 von Bernhard (Erstveröffentlichung: 16.11.2011)

die verfügbaren PowerShell Befehle können mit dem Befehl: ... weiterlesen

Preview PowerShell Log-Files: Logging in eine Textdatei - write to file

PowerShell Log-Files: Logging in eine Textdatei - write to file

geändert: 08.09.2021 von Bernhard (Erstveröffentlichung: 26.08.2020)

Logfiles in PowerShell können über den Befehl Out-File, über eine eigene Funktion oder über das in PowerShell integrierte Transcript erstellt werden. ... weiterlesen


Fragen / Kommentare


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

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

erstellt von Bernhard

✍anonym
erstellt am 22.03.2019 10: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 15: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 12.12.2013 11: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 13:04
Alles ohne foreach:
$array = @("wert1","wert2",wert3, "wert4", "wert5")
$array | % { write-host $_ }

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

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

erstellt von anonym

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

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

erstellt von Bernhard