# Sprache

Die Sprache ist das Fundament von PowerShell. Variablen, Operatoren, Strings und andere Sprachelemente bestimmen, was dein Code tut und warum er manchmal etwas völlig anderes tut als erwartet. Wenn du verstehen willst, wie PowerShell denkt, beginnt die Reise hier.

# Escape-Sequenzen

Escape-Sequenzen sind spezielle Zeichenkombinationen, mit denen sich **Steuerzeichen** innerhalb von Strings darstellen lassen, z. B. Zeilenumbrüche oder Tabs.

In PowerShell wird dafür das **Backtick-Zeichen** verwendet:

```
`
```

---

## **Grundlagen**

Escape-Sequenzen funktionieren **nur in doppelt-quoted Strings**:

```powershell
"Text`nNeue Zeile"   # funktioniert
'Text`nNeue Zeile'   # kein Effekt
```

---

## Wichtige Escape-Sequenzen

<table id="bkmrk-sequenz-bedeutung-be"><thead><tr><th>Sequenz</th><th>Bedeutung</th><th>Beschreibung</th></tr></thead><tbody><tr><td>``n`</td><td>New Line</td><td>Zeilenumbruch</td></tr><tr><td>``r`</td><td>Carriage Return</td><td>Cursor an den Anfang der Zeile</td></tr><tr><td>``r`n`</td><td>Windows-Zeilenumbruch</td><td>Kombination aus CR + LF</td></tr><tr><td>``t`</td><td>Tab</td><td>Tabulator</td></tr><tr><td>``</td><td>Backtick</td><td>Gibt ein Backtick-Zeichen aus</td></tr><tr><td>``"`</td><td>Anführungszeichen</td><td>Doppelte Quotes innerhalb von Strings</td></tr></tbody></table>

---

## **Beispiele**

### Zeilenumbruch

```powershell
"Hallo`nWelt"
```

Ausgabe:

```
Hallo
Welt
```

---

### Tabulator

```powershell
"Name`tAlter"
```

Ausgabe:

```
Name    Alter
```

---

### Windows-Zeilenumbruch

```powershell
"Hallo`r`nWelt"
```

---

## Verhalten in Dateien

Beim Arbeiten mit Dateien (z. B. `Out-File`, `Set-Content`) wird häufig ``r`n` verwendet, da dies dem Windows-Standard entspricht.

---

## **Typische Stolperfallen**

### 1. Falsche Anführungszeichen

```powershell
'Hallo`nWelt'   # ❌ kein Umbruch
```

### 2. Backtick übersehen

Das Escape-Zeichen ist **kein Apostroph (`'`)**, sondern:

```
`
```

### 3. Unsichtbare Zeichen

Escape-Sequenzen sind nicht sichtbar im Code, wirken aber auf die Ausgabe. Das macht Debugging manchmal… sagen wir… charakterbildend.

---

## **Alternative Methoden**

### .Split() (kein Escape, aber oft verwandt)

```powershell
"text1,text2" -split ","
```

Oder:

```powershell
"text1,text2".Split(",")

```

`.Split()` ist eine **.NET String-Methode**, kein Escape-Mechanismus, wird aber oft im gleichen Kontext verwendet, wenn Strings verarbeitet werden.

---

## Fazit

Escape-Sequenzen sind ein einfacher Weg, um Strings zu formatieren, ohne sie über mehrere Zeilen schreiben zu müssen.

Das wichtigste:

- Backtick = Escape
- Nur in `" "` aktiv
- ``n` für schnellen Zeilenumbruch
- ``r`n` für Windows-Kompatibilität

# Enum-Werte

Enum-Werte bedeuten vordefinierte mögliche Werte

### `[System.Environment+SpecialFolder]`

<table border="1" id="bkmrk-wert-bedeutung-deskt" style="border-collapse: collapse; width: 100%;"><colgroup><col style="width: 50.0596%;"></col><col style="width: 49.9404%;"></col></colgroup><tbody><tr><td>Wert</td><td>Bedeutung</td></tr><tr><td>`Desktop`</td><td>**Desktop** – Der Desktop vom aktuellen Benutzer</td></tr><tr><td>`MyComputer`</td><td>**Dieser PC** – beinhaltet Datenträger und Laufwerke</td></tr><tr><td>`Programs`</td><td>**Startmenü Programme** – Im Startmenü angezeigten Programme</td></tr><tr><td>  
</td><td>  
</td></tr></tbody></table>

MyDocuments  
Personal  
Favorites  
Startup  
Recent  
SendTo  
StartMenu  
MyMusic  
MyVideos  
DesktopDirectory  
NetworkShortcuts  
Fonts  
Templates  
CommonStartMenu  
CommonPrograms  
CommonStartup  
CommonDesktopDirectory  
ApplicationData  
PrinterShortcuts  
LocalApplicationData  
InternetCache  
Cookies  
History  
CommonApplicationData  
Windows  
System  
ProgramFiles  
MyPictures  
UserProfile  
SystemX86  
ProgramFilesX86  
CommonProgramFiles  
CommonProgramFilesX86  
CommonTemplates  
CommonDocuments  
CommonAdminTools  
AdminTools  
CommonMusic  
CommonPictures  
CommonVideos  
Resources  
LocalizedResources  
CommonOemLinks  
CDBurning

<div id="bkmrk-" style="color: #cccac2; background-color: #242936; font-family: Consolas, 'Courier New', monospace; font-weight: normal; font-size: 14px; line-height: 20px; white-space: pre;"></div><div id="bkmrk-x-%28x%29" style="color: rgb(0, 0, 0); font-size: 16px; line-height: 16px; background-color: rgb(247, 247, 247); border: 1px solid rgb(153, 153, 153); border-radius: 1px; top: 1px; left: 1px;"><div class="ir-ext-dimensions"><span class="ir-ext-rendered" title="Rendered image dimensions (after any scaling/resizing has been applied)"> x </span> <span class="ir-ext-natural" title="Natural image dimensions (without applying any scaling/resizing)"> (x) </span></div><div class="ir-ext-filesize"></div></div>

# PowerShell Variablen

Variablen die von PowerShell je nach Kontext, selbst deklariert werden.

<table border="1" id="bkmrk-variable-beschreibun" style="border-collapse: collapse; width: 100%; height: 300px;"><colgroup><col style="width: 19.1895%;"></col><col style="width: 80.8105%;"></col></colgroup><thead><tr style="height: 29.8px;"><td class="align-center" style="height: 29.8px;">**Variable**</td><td class="align-center" style="height: 29.8px; padding-left: 40px;">**Beschreibung**</td></tr></thead><tbody><tr style="height: 30.4667px;"><td class="align-center" style="height: 30.4667px;"><span style="color: rgb(53, 152, 219);">`$PSCommandPath`</span></td><td style="height: 30.4667px;">Vollständiger Pfad zum aktuellen Skript</td></tr><tr style="height: 30.4667px;"><td class="align-center" style="height: 30.4667px;"><span style="color: rgb(35, 111, 161);">`<span style="color: rgb(53, 152, 219);">$PSModulePath</span>`</span></td><td style="height: 30.4667px;">Beinhaltet die Pfade zu den Modulen</td></tr><tr><td class="align-center" style="height: 30.4667px;">`<span style="color: rgb(53, 152, 219);">$PSScriptRoot</span>`</td><td style="height: 30.4667px;">Der Pfad zum Ordner worin sich das aktuelle Skript befindet</td></tr><tr style="height: 29.8px;"><td class="align-center" style="height: 29.8px;">`<span style="color: rgb(53, 152, 219);">$MyInvocation</span>`</td><td style="height: 29.8px;">Enthält Infos darüber, wie das Skript aufgerufen wurde</td></tr></tbody></table>

### <span style="color: rgb(53, 152, 219);">`$PSScriptRoot`</span>

- **Datentyp:** <span style="color: rgb(185, 106, 217);">`System.String`</span>

### <span style="color: rgb(53, 152, 219);">`$PSCommandPath`</span>

- **Datentyp:** <span style="color: rgb(185, 106, 217);">`System.String`</span>

### <span style="color: rgb(53, 152, 219);">`$PSScriptRoot`</span>

- **Datentyp:**

### <span style="color: rgb(35, 111, 161);">`<span style="color: rgb(53, 152, 219);">$MyInvocation</span>`</span>

- **Datentyp:** <span style="color: rgb(251, 238, 184);">`InvocationInfo`</span>

Enthält Infos darüber, wie das Skript aufgerufen wurde

- <span style="color: rgb(255, 255, 255);">`<span style="color: rgb(53, 152, 219);">$MyInvocation</span>.<span style="color: rgb(251, 238, 184);">MyCommand</span>` </span>– Informationen und die Idendität des aktuellen Kommando-Objekts
- - <span style="color: rgb(255, 255, 255);">`<span style="color: rgb(53, 152, 219);">$MyInvocation</span>.<span style="color: rgb(251, 238, 184);">MyCommand.CommandType</span>`</span>
    - <span style="color: rgb(255, 255, 255);">`<span style="color: rgb(53, 152, 219);">$MyInvocation</span>.<span style="color: rgb(251, 238, 184);">MyCommand.Path</span>` </span>– Enthält den Pfad zum aktuellen Skript

# Operatoren

Operatoren sind spezielle Sprachelemente in PowerShell, die Werte verarbeiten, vergleichen, verknüpfen oder verändern. Sie bilden einen zentralen Bestandteil der Sprache und werden in nahezu jedem Skript verwendet.

Je nach Typ übernehmen Operatoren unterschiedliche Aufgaben:

- Werte vergleichen (`-eq`, `-ne`, `-gt`, ...)
- Logische Bedingungen verknüpfen (`-and`, `-or`, `-not`)
- Inhalte zusammenführen oder aufteilen (`-join`, `-split`)
- Berechnungen durchführen (`+`, `-`, `*`, `/`)

## String- und Array-Operatoren

Diese Operatoren werden häufig verwendet, um Texte und Listen zu verarbeiten.

### Split

Der Operator `-split` zerlegt einen String anhand eines Trennzeichens in mehrere Elemente eines Arrays.

Beispiel:

```powershell
"Max;Mustermann;30" -split ";"

```

Ergebnis:

```powershell
Max
Mustermann
30

```

Weitere Informationen findest du auf der Seite **Split**.

---

### Join

Der Operator `-join` führt mehrere Elemente eines Arrays zu einem einzelnen String zusammen.

Beispiel:

```powershell
"Max","Mustermann",30 -join ";"

```

Ergebnis:

```powershell
Max;Mustermann;30

```

Weitere Informationen findest du auf der Seite **Join**.

---

## Merksatz

`-split` macht aus einem String ein Array.

`-join` macht aus einem Array einen String.

Beide Operatoren werden häufig gemeinsam verwendet, wenn Daten eingelesen, verarbeitet und anschließend wieder ausgegeben werden.

# Join

Der `-join` Operator in PowerShell wird verwendet, um mehrere Elemente (z. B. Strings in einem Array) zu einem einzigen String zusammenzufügen.

---

## 🧠 Syntax

```powershell
<array> -join <delimiter>

```

Oder ohne Trennzeichen:

```powershell
<array> -join

```

---

## 📌 Grundlagen

- Gibt immer einen **String (`System.String`)** zurück
- Verbindet alle Elemente eines Arrays **in der gegebenen Reihenfolge**
- Der Delimiter wird **wörtlich verwendet** (kein Regex!)
- Standard-Delimiter ist ein **leerer String** (`""`)

---

## 🔹 Beispiele

### Einfaches Zusammenfügen

```powershell
$array = "Apfel","Birne","Banane"
$result = $array -join ","

```

**Ergebnis:**

```powershell
Apfel,Birne,Banane

```

---

### Join ohne Trennzeichen

```powershell
$array = "Hallo","Welt"
$result = $array -join

```

**Ergebnis:**

```powershell
HalloWelt

```

---

### Join mit Leerzeichen

```powershell
$array = "Das","ist","ein","Test"
$result = $array -join " "

```

**Ergebnis:**

```powershell
Das ist ein Test

```

---

### Join mit Zeilenumbruch

```powershell
$array = "Zeile1","Zeile2","Zeile3"
$result = $array -join "`n"

```

**Ergebnis:**

```powershell
Zeile1
Zeile2
Zeile3

```

---

## ⚠️ Wichtige Hinweise

### 1. Kein Regex

**Im Gegensatz zu `<a href="https://doku.borinas.com/books/powershell-programmierung/page/split" title="Split">-split</a>`:**  
Der Delimiter wird **nicht** als [regulärer Ausdruck](https://doku.borinas.com/books/webseiten-entwicklung/page/regularer-ausdruck-regex "Regulärer Ausdruck (RegEx)") interpretiert.

Das bedeutet:

- Sonderzeichen haben **keine spezielle Bedeutung**
- `"."` ist einfach ein Punkt, kein Platzhalter

---

### 2. `$null`-Werte

```powershell
$array = "A",$null,"B"
$result = $array -join ","

```

**Ergebnis:**

```powershell
A,,B

```

**Erklärung:**

- `$null` wird als **leerer String** behandelt
- Der Delimiter wird trotzdem eingefügt

---

### 3. Nicht-String-Werte

```powershell
$array = 1,2,3
$result = $array -join "-"

```

**Ergebnis:**

```powershell
1-2-3

```

**Erklärung:**

- Alle Elemente werden **automatisch in Strings konvertiert**

---

## 🔄 Alternative Methoden

### `[string]::Join()`

```powershell
[string]::Join(",", $array)

```

**Unterschied zu `-join`:**

- Methodenaufruf statt Operator
- Gleiche Funktionalität, oft in .NET-Kontexten verwendet

---

## 🧩 Typische Anwendungsfälle

- Array in einen String umwandeln
- CSV-Zeilen erzeugen
- Textausgaben formatieren
- Mehrzeilige Strings erzeugen

---

## 🧪 Mini-Beispiel aus der Praxis

```powershell
$user = "Max","Mustermann",30
$csv = $user -join ";"

```

**Ergebnis:**

```powershell
Max;Mustermann;30

```

---

## 🧠 Merksatz

> `-join` klebt alles zusammen. Ohne Struktur, wenn du keinen Delimiter setzt.

# Split

Der `-split` Operator in PowerShell wird verwendet, um einen String anhand eines Trennzeichens (Delimiter) in ein Array von Teilstrings aufzuteilen.

---

## 🧠 Syntax

```powershell
<string> -split <delimiter>

```

Oder mit erweiterten Optionen:

```powershell
<string> -split <delimiter>, <max-substrings>, <options>

```

---

## 📌 Grundlagen

- Gibt immer ein **Array (`System.String[]`)** zurück
- Der **Delimiter ist ein [regulärer Ausdruck](https://doku.borinas.com/books/webseiten-entwicklung/page/regularer-ausdruck-regex "Regulärer Ausdruck (RegEx)") (RegEx!)**, kein einfacher Text
- Groß-/Kleinschreibung kann beeinflusst werden

---

## 🔹 Beispiele

### Einfaches Splitten

```powershell
$text = "Apfel,Birne,Banane"
$result = $text -split ","

```

**Ergebnis:**

```powershell
Apfel
Birne
Banane

```

---

### Split mit Leerzeichen

```powershell
$text = "Das ist ein Test"
$result = $text -split " "

```

---

### Mehrere Trennzeichen (Regex)

```powershell
$text = "Apfel;Birne,Banane"
$result = $text -split "[,;]"

```

**Erklärung:**

- `[ , ; ]` bedeutet: splitte bei Komma **oder** Semikolon

---

### 💡 Verhalten bei `max-substrings`

Wenn die maximale Anzahl an Elementen erreicht ist:

> **Das letzte Element im Ergebnis enthält den gesamten verbleibenden Rest des Strings und wird nicht weiter gesplittet.**

```powershell
$text = "A,B,C,D"
$result = $text -split ",", 2

```

**Ergebnis:**

```powershell
A
B,C,D

```

**Erklärung:**

- Es werden maximal **2 Elemente** erzeugt
- Das erste Element entsteht durch den ersten Split
- Das zweite Element enthält **alles, was danach noch übrig ist** (`B,C,D`)

---

### 🧩Split mit Optionen

```powershell
$text = "a,b,c"
$result = $text -split ",", 0, "IgnoreCase"

```

#### Mögliche Optionen:

- `IgnoreCase`  
    → Groß- und Kleinschreibung wird ignoriert  
    → `"A,B,C" -split "a"` würde trotzdem funktionieren
- `CaseSensitive`  
    → Groß- und Kleinschreibung wird beachtet  
    → `"A,B,C" -split "a"` liefert **kein Ergebnis**, da kein Match
- `SimpleMatch`  
    → Der Delimiter wird **als normaler Text behandelt, nicht als Regex**  
    → Sonderzeichen wie `.`, `*`, `+` verlieren ihre Regex-Bedeutung
    
    Beispiel:
    
    ```powershell
    "1.2.3" -split ".", 0, "SimpleMatch"
    
    ```
    
    → funktioniert ohne Escape (`\.`)

---

## ⚠️ Wichtige Hinweise

### 1. Regex-Falle

```powershell
$text = "1.2.3"
$result = $text -split "."

```

**Problem:**  
`.` bedeutet im Regex „beliebiges Zeichen“

➡️ Ergebnis: komplett zerlegt

**Lösung:**

```powershell
$result = $text -split "\."

```

---

### 🗑 2. Leere Elemente

```powershell
"text,,text" -split ","

```

**Ergebnis:**

```powershell
text

text

```

**Erklärung:**

- Jeder Teilstring entsteht **zwischen zwei Trennzeichen (Delimiter)**
- Wenn zwei Delimiter direkt aufeinander folgen (`,,`), liegt dazwischen **kein Inhalt**
- PowerShell erzeugt dafür trotzdem ein Element im Array

> Dieses Element ist ein **leerer String (`""`)**, kein `null`

---

## 🔄 Alternative Methoden

### `.Split()` (kein Regex!)

```powershell
$text = "A,B,C"
$result = $text.Split(",")

```

**Unterschied zu `-split`:**

- `.Split()` verwendet **kein Regex**
- oft schneller und einfacher
- weniger flexibel

---

### `[regex]::Split()`

```powershell
[regex]::Split("A,B,C", ",")

```

➡️ Alternative mit explizitem Regex-Handling

---

## 🧩 Typische Anwendungsfälle

- CSV-Daten zerlegen
- Log-Dateien parsen
- Benutzereingaben aufteilen
- Pfade oder Listen verarbeiten

---

## 🧪 Mini-Beispiel aus der Praxis

```powershell
$csv = "Max;Mustermann;30"
$name = $csv -split ";"

$vorname = $name[0]
$nachname = $name[1]
$alter = $name[2]

```

---

## 🧠 Merksatz

> `-split` denkt in Regex. Wenn du das vergisst, bekommst du Chaos statt Struktur.