# Powershell Masterclass Powershell-Version herausfinden ``` Get-Host ``` Hilfe erhalten ``` Get-Help Get-Command ``` Beschreibungen zu Hilfen Parameter in \[ \] verpflichtend `[-Logname] ` Paramenter komplett in \[ \] optional `[-ComputerName ]` ### Wichtige Befehle (Cmd-lets) Aufbau: Verb-Nomen Parameter
**CMD-Let****Beschreibung**
`Get-Uptime` Zeigt an, wie lange der Letzte Boot her ist
`Get-ComputerInfo` Zeigt die Computerinfo an
`Get-ChildItem` Verzeichnisinhalt anzeigen
`Set-Location` Aktuellen Ordner festlegen `Set-Location HKLM` setzt die Location auf die Registry
`Start-Transcript` `Stop-Transcript` Zum Loggen verwenden
`Read-Host` `Write-Host` Benutzereingabe abfragen Gibt auf die Konsole aus
`Start-Process` Programm öffnen `Start-Process notepad`
`New-Item` Erstell eine neue Datei `New-Item -ItemType File -Path C: -Force`
`Add-Content` Fügt einer Datei Inhalt hinzu
`Get-Content` Auslesen einer Datei
`Measure-Object` Zählen gleich wie `.Count` Vorher in Klammern setzen
`Measure-Command` 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}`
`Foreach-Object`Nimmt jedes Objekt entgegen
`Where-Object` Filtert auf bestimmte Eigenschaften `Get-Process | Where-Object CPU -GT 10`
### Parameter
**Option****Beschreibung**
`-Recurse`Auch für Unterordner
`-Confirm`Fordert zur Bestätigung aus `-Confirm:$false` Damit wird das Bestätigen umgangen
`-AsSecureString`Verschlüsselt abspeichern
`-Whatif` Was wäre wenn. Der Befehl wird nicht ausgeführt
`-Verbose` Was wird passieren
`-PassThru` Gibt nur die Werte wieder, keine Tabellen
`-Wrap`Zeilenumbruch
`-AutoSize`Passt die Spaltenansicht an
### 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
Get-ExecutioanPolicy -List
RestrictedNichts erlaubt
UnrestrictedAlles erlaubt
RemoteSignedAus dem Internet geladene müssen signiert sein
AllSignedMüssen auch die eigenen signiert sein
Bypass
#### 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

Format Befehle sollten immer am Ende eines Befehls stehen und diehnen zur Ausgabe auf der Konsole

```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 ```

Schlüsselfunktion in Powershell!

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 * ```