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.
{{percentage}} % positiv
DANKE für deine Bewertung!
Fragen / Kommentare
(sortiert nach Bewertung / Datum) [alle Kommentare(neueste zuerst)]
User: Wittgenstein Interessant ist auch, dass man Arrays in eine foreach pipen kann: $array | foreach { $_ } ist das gleiche wie foreach ($i in $array) { $i }
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
Für mich wäre 3. interessant was genau nicht funktioniert ;-P
Beitrag erstellt von Bernhard
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
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
User: xermicus Einfacher geht die Abfrage er ein foreach-Konstrukt: $array = @("wert1","wert2",wert3, "wert4", "wert5") foreach ($item in $array) { write-host $item }
Alles ohne foreach: $array = @("wert1","wert2",wert3, "wert4", "wert5") $array | % { write-host $_ }
Beitrag erstellt von anonym
Hallo, Kurze Randbemerkung: % ist auch eine Foreach-Schleife, nur als Alias für schreibfaule
Beitrag erstellt von anonym
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++ }
danke, habe ich ausgebessert
Beitrag erstellt von Bernhard