# Set-Alias

Das Cmdlet `Set-Alias` erstellt oder verändert einen Alias für ein Cmdlet, eine Funktion oder einen Befehl.

Ein Alias ist dabei einfach ein alternativer Kurzname für einen bestehenden Command.

Es wird häufig verwendet, um:

- häufig genutzte Befehle schneller aufzurufen
- eigene Kurzbefehle zu definieren
- bestehende Aliase umzubiegen oder anzupassen
- Shell-Umgebungen individueller zu gestalten

---

## 🔧 Syntax

```powershell
Set-Alias [-Name] <String> [-Value] <String>
          [-Description <String>]
          [-Option <ScopedItemOptions>]
          [-PassThru]
          [-Scope <String>]
          [-Force]
          [-WhatIf]
          [-Confirm]
          [<CommonParameters>]

```

---

## 📌 Parameter

### `-Name`

- **Typ:** `String`
- **Pflicht:** Ja
- Name des Alias

```powershell
Set-Alias -Name ll -Value Get-ChildItem

```

---

### `-Value`

- **Typ:** `String`
- **Pflicht:** Ja
- Zielbefehl, auf den der Alias zeigen soll

```powershell
Set-Alias -Name edit -Value notepad

```

---

### `-Description`

- **Typ:** `String`
- **Pflicht:** Nein
- Fügt dem Alias eine Beschreibung hinzu

```powershell
Set-Alias -Name gs -Value Get-Service -Description "Listet Dienste auf"

```

---

### `-Option`

- **Typ:** `ScopedItemOptions`
- **Pflicht:** Nein
- Steuert das Verhalten des Alias

Mögliche Optionen:

<table id="bkmrk-option-bedeutung-non"><thead><tr><th>Option</th><th>Bedeutung</th></tr></thead><tbody><tr><td>`None`</td><td>Keine besondere Einschränkung</td></tr><tr><td>`ReadOnly`</td><td>Alias kann nur mit `-Force` geändert werden</td></tr><tr><td>`Constant`</td><td>Alias kann gar nicht mehr geändert werden</td></tr><tr><td>`Private`</td><td>Nur im aktuellen Scope sichtbar</td></tr></tbody></table>

```powershell
Set-Alias -Name test -Value Get-Date -Option ReadOnly

```

---

### `-PassThru`

- Gibt das erstellte Alias-Objekt zurück

```powershell
Set-Alias -Name now -Value Get-Date -PassThru

```

---

### `-Scope`

- Legt fest, in welchem Scope der Alias existiert

Beispiele:

<table id="bkmrk-scope-bedeutung-loca"><thead><tr><th>Scope</th><th>Bedeutung</th></tr></thead><tbody><tr><td>`Local`</td><td>Nur aktueller Scope</td></tr><tr><td>`Global`</td><td>Überall verfügbar</td></tr><tr><td>`Script`</td><td>Nur innerhalb des Skripts</td></tr></tbody></table>

```powershell
Set-Alias -Name ll -Value Get-ChildItem -Scope Global

```

---

### `-Force`

- Erzwingt das Überschreiben von `ReadOnly`-Aliases

```powershell
Set-Alias -Name ls -Value Get-Process -Force

```

---

## ⚠️ Hinweise zur Verwendung

- Aliase speichern **keine Parameter**
- Ein Alias ersetzt nur den Befehlsnamen
- Aliase gelten standardmäßig nur für die aktuelle Sitzung
- Für dauerhafte Aliase muss man sie ins Profil (`$PROFILE`) schreiben
- `Constant`-Aliases können nicht mehr entfernt werden

---

## 📊 Verhalten

<table id="bkmrk-eigenschaft-beschrei"><thead><tr><th>Eigenschaft</th><th>Beschreibung</th></tr></thead><tbody><tr><td>Rückgabewert</td><td>Standardmäßig keiner</td></tr><tr><td>Überschreibbar</td><td>Ja, außer `Constant`</td></tr><tr><td>Persistenz</td><td>Nur aktuelle Sitzung</td></tr><tr><td>Unterstützt Funktionen</td><td>Ja</td></tr><tr><td>Unterstützt EXE-Dateien</td><td>Ja</td></tr></tbody></table>

---

## 🧪 Beispiele

### Einfachen Alias erstellen

```powershell
Set-Alias -Name ll -Value Get-ChildItem

```

Jetzt funktioniert:

```powershell
ll

```

---

### Alias für Programme

```powershell
Set-Alias -Name np -Value notepad

```

---

### Bestehenden Alias überschreiben

```powershell
Set-Alias -Name ls -Value Get-Process -Force

```

Jetzt startet `ls` plötzlich Prozesse statt Dateien aufzulisten.  
Ein hervorragender Weg, sich selbst drei Stunden später maximal zu verwirren.

---

### Alias dauerhaft speichern

```powershell
Add-Content -Path $PROFILE -Value 'Set-Alias -Name ll -Value Get-ChildItem'

```

---

### Alias anzeigen

```powershell
Get-Alias ll

```

---

## ⚙️ Typische Anwendungsfälle

- Eigene Kurzbefehle erstellen
- Linux-ähnliche Befehle nachbauen
- Lange Befehlsnamen abkürzen
- Eigene Shell-Umgebungen konfigurieren
- Schnellzugriffe für Skripte

---

## ❗ Alternativen / Ergänzungen

### `New-Alias`

```powershell
New-Alias -Name ll -Value Get-ChildItem

```

**Unterschied zu `Set-Alias`:**

<table id="bkmrk-cmdlet-verhalten-new"><thead><tr><th>Cmdlet</th><th>Verhalten</th></tr></thead><tbody><tr><td>`New-Alias`</td><td>Erstellt nur neue Aliase</td></tr><tr><td>`Set-Alias`</td><td>Erstellt oder überschreibt</td></tr></tbody></table>

---

### Funktionen statt Alias

```powershell
function ll {
    Get-ChildItem -Force
}

```

**Vorteil:**

- Kann Parameter enthalten
- Deutlich flexibler
- Besser für komplexe Logik

---

## 🚫 Typische Fehler

### 1. Denken, dass Aliase Parameter speichern

```powershell
# ❌ Funktioniert NICHT wie erwartet
Set-Alias -Name ll -Value "Get-ChildItem -Force"

```

Ein Alias verweist nur auf einen Commandnamen.  
Nicht auf eine komplette Befehlszeile.

➡️ Dafür nutzt man Funktionen.

---

### 2. Alias nach Neustart weg

```powershell
Set-Alias -Name test -Value Get-Date

```

Nach neuer PowerShell-Sitzung verschwunden.

➡️ Alias ins `$PROFILE` schreiben.

---

### 3. Wichtige Standard-Aliase überschreiben

```powershell
Set-Alias -Name cd -Value Get-Date

```

Technisch möglich.  
Psychologisch fragwürdig.

---

## 🧠 Best Practices

- Nur sinnvolle Kurzformen verwenden
- Standard-Aliase nicht leichtfertig überschreiben
- Für komplexe Logik lieber Funktionen nutzen
- Dauerhafte Aliase ins `$PROFILE` auslagern
- In Skripten sparsam mit Aliases umgehen, damit der Code lesbar bleibt