# Powershell Masterclass

Powershell-Version herausfinden

```
Get-Host
```

Hilfe erhalten

```
Get-Help Get-Command
```

Beschreibungen zu Hilfen

Parameter in \[ \] verpflichtend `[-Logname] <String>`   
Paramenter komplett in \[ \] optional `[-ComputerName <String[]>]`

### Wichtige Befehle (Cmd-lets)

Aufbau: Verb-Nomen Parameter

<table border="1" id="bkmrk-cmd-let-beschreibung" style="border-collapse: collapse; width: 100%;"><colgroup><col style="width: 50%;"></col><col style="width: 50%;"></col></colgroup><tbody><tr><td>**CMD-Let**</td><td>**Beschreibung**</td></tr><tr><td>`Get-Uptime`  
</td><td>Zeigt an, wie lange der Letzte Boot her ist</td></tr><tr><td>`Get-ComputerInfo`  
</td><td>Zeigt die Computerinfo an</td></tr><tr><td>`Get-ChildItem`  
</td><td>Verzeichnisinhalt anzeigen </td></tr><tr><td>`Set-Location`  
</td><td>Aktuellen Ordner festlegen   
`Set-Location HKLM` setzt die Location auf die Registry

</td></tr><tr><td>`Start-Transcript`  
`Stop-Transcript`  
</td><td>Zum Loggen verwenden

</td></tr><tr><td>`Read-Host`

`Write-Host`

</td><td>Benutzereingabe abfragen

Gibt auf die Konsole aus

</td></tr><tr><td>`Start-Process`

</td><td>Programm öffnen `Start-Process notepad`

</td></tr><tr><td>`New-Item`

</td><td>Erstell eine neue Datei   
`New-Item -ItemType File -Path C: -Force`

</td></tr><tr><td>`Add-Content`

</td><td>Fügt einer Datei Inhalt hinzu

</td></tr><tr><td>`Get-Content`

</td><td>Auslesen einer Datei

</td></tr><tr><td>`Measure-Object`

</td><td>Zählen   
gleich wie `.Count` Vorher in Klammern setzen

</td></tr><tr><td>`Measure-Command`

</td><td>Messen von Befehlen. Wie lange dauert ein Befehl. Damit kann die Zeit gemessen werden.  
`Measure-Command { Get-ADComputer -Filter 'enabled -eq $false' | Set-ADComputer -Enabled $true}`

</td></tr><tr><td>`Foreach-Object`</td><td>Nimmt jedes Objekt entgegen

</td></tr><tr><td>`Where-Object`  
</td><td>Filtert auf bestimmte Eigenschaften  
`Get-Process | Where-Object CPU -GT 10`

</td></tr><tr><td>  
</td><td></td></tr></tbody></table>

### Parameter

<table border="1" id="bkmrk-option-beschreibung-" style="border-collapse: collapse; width: 100%; height: 230.422px;"><colgroup><col style="width: 50%;"></col><col style="width: 50%;"></col></colgroup><tbody><tr style="height: 29.7969px;"><td style="height: 29.7969px;">**Option**</td><td style="height: 29.7969px;">**Beschreibung**</td></tr><tr style="height: 30.1094px;"><td style="height: 30.1094px;">`-Recurse`</td><td style="height: 30.1094px;">Auch für Unterordner</td></tr><tr style="height: 63.7031px;"><td style="height: 63.7031px;">`-Confirm`</td><td style="height: 63.7031px;">Fordert zur Bestätigung aus  
`-Confirm:$false` Damit wird das Bestätigen umgangen</td></tr><tr style="height: 30.1094px;"><td style="height: 30.1094px;">`-AsSecureString`</td><td style="height: 30.1094px;">Verschlüsselt abspeichern</td></tr><tr style="height: 46.5938px;"><td style="height: 46.5938px;">`-Whatif`  
</td><td style="height: 46.5938px;">Was wäre wenn. Der Befehl wird nicht ausgeführt</td></tr><tr style="height: 30.1094px;"><td style="height: 30.1094px;">`-Verbose`  
</td><td style="height: 30.1094px;">Was wird passieren</td></tr><tr><td>`-PassThru`  
</td><td>Gibt nur die Werte wieder, keine Tabellen</td></tr><tr><td>`-Wrap`</td><td>Zeilenumbruch</td></tr><tr><td>`-AutoSize`</td><td>Passt die Spaltenansicht an</td></tr></tbody></table>

### Alias

`Get-Alias` zeigt alle Aliase an

### Variablen

erstellen `$a`

zu Variablen hinzufügen `$a += 2` Es wird die Variable um 2 erhöht

### Execution Policy

<table border="1" id="bkmrk-get-executioanpolicy" style="border-collapse: collapse; width: 100%;"><colgroup><col style="width: 49.9244%;"></col><col style="width: 49.9244%;"></col></colgroup><tbody><tr><td>Get-ExecutioanPolicy -List</td><td>  
</td></tr><tr><td>Restricted</td><td>Nichts erlaubt</td></tr><tr><td>Unrestricted</td><td>Alles erlaubt</td></tr><tr><td>RemoteSigned</td><td>Aus dem Internet geladene müssen signiert sein</td></tr><tr><td>AllSigned</td><td>Müssen auch die eigenen signiert sein</td></tr><tr><td>Bypass</td><td>  
</td></tr></tbody></table>

#### Setzen

`Set-ExecutionPolicy Bypass`

#### Dateien freigeben zum ausführen 

```powershell
Unblock-File
```

### Programmbeispiele 

[hier zu finden](https://wiki.hhml.selfhost.co/books/programmieren/page/powershell-programmbeispiele "Powershell Programmbeispiele")

### Profile erstellen

Darin können verschiedene Einstellungen gespeichert werden, damit Powershell immer mit den gleichen Optionen startet.

```powershell
New-Item $PROFILE -ItemType File -Force
```

### Hilfe lesen können

- Aufrufen mit Get-Help und dem Befehl
- Beispiele sind besser um etwas zu verstehen 
    - [Das gibt es Online](https://learn.microsoft.com/de-de/powershell/)

### Pipeline

Was ist die Pipeline

[![image.png](https://wiki.hhml.selfhost.co/uploads/images/gallery/2023-03/scaled-1680-/vGFimage.png)](https://wiki.hhml.selfhost.co/uploads/images/gallery/2023-03/vGFimage.png)

### Format Befehle

<p class="callout info">Format Befehle sollten immer am Ende eines Befehls stehen und diehnen zur Ausgabe auf der Konsole</p>

```powershell
Get-Process | Format-Table Id,ProcessName
```

```powershell
Get-Process | Format-List
```

### Out Befehle

```powershell
Out-File #Ausgabe als Datei
Out-Printer #Ausgabe auf dem Standard-Drucker
Out-Null #Keine Ausgabe 
Out-Gridview #Zeigt die Ausgabe als Tabelle an

Get-Process | Out-File $home\process.txt

```

#### Out-Gridview

Mit dem folgenden Skript werden alle AD-User an GridView übergeben. Der Parameter PassThru ermöglicht es eine Auswahl zu treffen. Diese Auswahl wird dann an Disable ADAccount weiter.

```powershell
Get-ADUser -Filter * | Out-GridView -PassThru | Disable-ADAccount -Verbose
```

#### Tee-Object

Mit dem CMDlet wird das Ergebnis in der Konsole ausgegeben und als Datei gespeichert.

```powershell
Get-ADUser -Filter * | Tee-Object -FilePath $home\adusers.txt
```

#### CSV

```powershell
Get-ADUser -Filter * | Export-Csv $home\aduserscsv.csv

Import-Csv -Path $home\aduserscsv.csv
```

#### $\_ und $PSItem

[![image.png](https://wiki.hhml.selfhost.co/uploads/images/gallery/2023-04/scaled-1680-/image.png)](https://wiki.hhml.selfhost.co/uploads/images/gallery/2023-04/image.png)

Damit wird in der Pipeline jede Variable in den jeweiligen Durchlauf übergeben.

[![image.png](https://wiki.hhml.selfhost.co/uploads/images/gallery/2023-04/scaled-1680-/tBKimage.png)](https://wiki.hhml.selfhost.co/uploads/images/gallery/2023-04/tBKimage.png)

Ein weiteres Beispiel in dem zwei Filter kombiniert werden

```powershell
Get-Prozess | Where {$_.CPU -gt 50 -AND $_.Handles -gt 1000}
```

### Filtern

[Weitere Infos auf der Website](https://sid-500.com/2018/02/15/powershell-for-beginners-part-10-filtering-and-where-object/)

[![image.png](https://wiki.hhml.selfhost.co/uploads/images/gallery/2023-04/scaled-1680-/yCGimage.png)](https://wiki.hhml.selfhost.co/uploads/images/gallery/2023-04/yCGimage.png)

Der Unterschied zwischen den beiden Filtern ist, dass der obere schneller ist, weil der Filter schon vor der Pipeline ausgeführt wird.

[![image.png](https://wiki.hhml.selfhost.co/uploads/images/gallery/2023-04/scaled-1680-/43Aimage.png)](https://wiki.hhml.selfhost.co/uploads/images/gallery/2023-04/43Aimage.png)

### Sort-Object und Select-Object

```powershell
# Sort-Object
Get-Process | Sort-Object CPU -Descending

# Select-Object 
Get-Process | Select-Object CPU,Id,ProcessName
```

Select-Object macht etwas ähnliches wie Format-Table nur das die Daten nicht verändert werden. Dadurch kann man mit allen Daten weiter arbeiten.

```powershell
# Gemischt
Get-Process | Sort-Object CPU -Descending | Select-Object ProcessName,CPU -First 3
```

<p class="callout info">Schlüsselfunktion in Powershell! </p>

Select-Object mit -ExpandProberty dann wird wirklich nur der Name ausgeben und nicht eine Tabelle die die Namen enthält.

```powershell
$comp = Get-ADComputer -Filter * | Select-Object -ExpandProperty Name
Test-Connection -ComputerName $comp #Text-Connection kann Multible anfragen entgegennehmen und alles in $comp anpingen
```

### Get-Member und Select-Object \* 

```powershell
# Gibt aus was es alles an Möglichkeiten zu einem CMD-Let gibt
Get-Process | Get-Member

# Hiermit kann man alles alles ausgeben
Get-Process | Select-Object -Property * 
```