Jetzt testen

Scripten in Dauerschleife: Einführung in PowerShell-Schleifen

Inhaltsverzeichnis

Post Featured Image

Schleifen sind die Lebensader der meisten Programmiersprachen, und sie spielen eine integrale Rolle in jedem Code. Die Steuerung der Ausführung eines Programms, das über eine Reihe von Elementen iterieren soll, ist eine häufig auftretende Aufgabe.

PowerShell ist da keine Ausnahme und bietet eine Reihe verschiedener Schleifenoptionen und Möglichkeiten zur Steuerung der Codeausführung. Dieser Artikel gibt einen Überblick über die verschiedenen Arten von PowerShell-Schleifen und darüber, was Sie mit ihnen erreichen können.

 

Welche PowerShell-Schleifen gibt es?

  • For
  • ForEach-Object
  • Foreach
  • While
  • Do-While
  • Do-Until

Einige dieser Schleifen sind in ihrer Funktionsweise traditionell, während andere, wie ForEach-Object, nur in PowerShell und in der Funktionsweise der PowerShell-Objektpipeline vorkommen. Alle diese Schleifen haben ihren Platz und sind auf unterschiedliche Weise nützlich.


For-Schleife

Die For-Schleife ist eine der ersten Schleifen, deren Verwendung die meisten Programmierer erlernen. Sie wird normalerweise verwendet, um eine bestimmte Anzahl von Schritten durch eine Sammlung zu machen und den definierten Code bei jeder Iteration auszuführen. Die For-Schleife erfordert die Definition einer Iterator-Variablen mit einem Anfangswert, einer zu erfüllenden Bedingung, die die Schleife beendet, und die Angabe, wie die Iterator-Variable jedes Mal, wenn die Schleife ausgeführt wird, erhöht oder verringert werden kann. Hier ist ein Beispiel:

For ($i = 1; $i -LE 5; $i++) {
		$i * 2 
		}

# Output 2, 4, 6, 8, 10

Diese einfache Schleife arbeitet mit der Variablen $i und multipliziert, wie Sie sehen können, einfach den Wert des Iterators bei jedem Durchlauf der Schleife mit 2.


Foreach-Schleife

Die Objektpipeline gibt es nur in der PowerShell-Scriptsprache. Sie ermöglicht eine höhere Flexibilität bei der Manipulation der Objekte, über die iteriert wird, jedoch mit dem Nachteil einer verlangsamten Leistung.

Um dem entgegenzuwirken, ermöglicht die foreach-Anweisung in PowerShell das Frontloading aller Elemente einer Sammlung von Objekten, über die iteriert werden soll, anstatt diese Objekte wie bei ForEach-Object einzustreamen. Dies bedeutet zwar eine höhere Speichernutzung, aber auch eine erhöhte Leistung. Hier ein Beispiel:

$Array = 1..5 

Foreach ($Number In $Array) {
		$Number
		} 
		
# Output 
1, 2, 3, 4, 5

Eine nützliche Eigenschaft ist, dass Foreach mit einem Cmdlet verwendet werden kann, das eine Auflistung von Objekten zurückgibt. Eines der gängigsten Beispiele hierfür ist die Verwendung von Get-ChildItem zum Ausgeben einer Sammlung von Dateien.

 

$i = 1 Foreach ($File in Get-ChildItem) {
"File {0}: {1}" -F $i, $File.FullName $i++
}
# Output
File 1: C:\Test\File1.txt
File 2: C:\Test\File2.txt

Eine weitere sehr nützliche Funktion ist die Möglichkeit, eine Zahl zu überspringen, indem sie die spezielle Funktion von $foreach.MoveNext() verwenden. Dies ermöglicht es Ihnen, die aktuelle Schleife zu überspringen und zum nächsten Wert überzugehen.

In diesem Beispiel sende ich die Ausgabe an Out-Null, da der zurückgegebene Standardwert true ist, und ich ihn somit nicht anzeigen möchte.


$Array = 1..20
Foreach ($Number In $Array) { 
		If ($Number % 2) {
		$Foreach.MoveNext() | Out-Null 
		} 
		$Number 
		} 
		
# Output
1, 3, 5, 7, 9, 11, 13, 15, 17, 19

ForEach-Object-Schleife

Wie in der Foreach-Schleife beschrieben, erwartet ForEach-Object einen Stream von Objekten aus der PowerShell-Pipeline. Diese Methode ist nicht ganz so schnell wie Foreach und bietet einige zusätzliche Funktionen, die ForEach-Object sehr flexibel machen.

Hierfür gibt es zwei Hauptgründe:

  • Fähigkeit Begin-, Prozess- und End-Blöcke zu nutzen
  • Streamen der resultierenden Objekte an Cmdlets weiter unten in der Pipeline
$Array = @("Item4", "Item2", "Item1", "Item3") 
$Array | ForEach-Object {
		"{0}.{1}" -F $_, "txt" 
		} | Sort-Object 
		
# Output Item1.txt, Item2.txt, Item3.txt, Item4.txt

Wie oben erwähnt, ist die andere nützliche Funktion die Möglichkeit, einen Begin- und End-Block zusammen mit dem Standard-Prozessblock zu definieren.

$Array = @("Item4", "Item2", "Item1", "Item3")
$Array | ForEach-Object { $i = 0 } {
		"File {0}: {1}.{2}" -F $i, $_, "txt" 
		$i++ 
		} { Write-Host "Files Count: $i" } 
		
# Output 
File 0: Item4.txt 
File 1: Item2.txt 
File 2: Item1.txt 
File 3: Item3.txt 
Files Count: 4

 

While-Schleife

Die while-Schleife ist eine einfache PowerShell-Schleife, die fortgesetzt wird, solange die Bedingung wahr ist. Dies bedeutet auch, dass Sie potenziell Endlosschleifen erstellen können.

While ($Value -NE 3) { 
		$Value++ 
		Write-Host "Value: $Value" 
		} 

#Output 
Value: 1 
Value: 2 
Value: 3

Ein Beispiel für eine Endlosschleife ist einfach eine Bedingung, die immer als wahr gewertet wird. Sie können dies durch den folgenden Code erreichen.

While ($True) { 
		"This will run forever!" 
		}

#Output
This will run forever!

Do-While-Schleife

Ähnlich wie bei einer while-Schleife hängt das Do-While-Konstrukt einfach einen Scriptblock an eine while-Schleife an, was bedeutet, dass das Script mindestens einmal ausgeführt wird, selbst wenn die while-Schleife beim nächsten oder ersten Durchlauf sofort als falsch gewertet wird.

Do { 
		Write-Host "This will display no matter what" 
		} While ($False) 
		
# Output
This will display no matter what

Do-Until-Schleife

Die Do-Until-Anweisung ist im Wesentlichen die Umkehrung von Do-While. Der Scriptblock wird mindestens ein Mal ausgeführt, maximal bis die Bedingung wahr wird.

Do { 
		Write-Host "This will display no matter what" 
		} Until ($True) 
		
# Output
This will display no matter what

Fazit

Wie Sie sehen können, gibt es viele nützliche Möglichkeiten, wie PowerShell-Schleifen verwendet und kombiniert werden können, um immer leistungsfähigere Scripts zu erstellen. Das Beherrschen von PowerShell-Schleifen erhöht garantiert den Nutzen von PowerShell und zeigt, wie es bei der Automatisierung selbst der komplexesten Aufgaben helfen kann.

Eine ganze Reihe von Beispielen finden Sie in den ScriptRunner ActionPacks. Diese gebrauchsfertigen und kostenlosen PowerShell-Scripte ermöglichen Ihnen die schnelle und einfache Umsetzung von zahlreichen Use Cases aus dem Bereich Systems Administration und IT Operations Management.

 

Über den Autor: