Private/Wissen/B_Basic/B6_Hilfe-System.ps1

<#
 
# Hilfe
 
Hilfe zur PowerShell und Cmdlets abrufen. Cmdlets finden und verstehen.
 
- **Hashtags** Help about Parameter Find cmdlet
 
- **Version** 2020.05.25
 
#>


#region 1. PowerShell-Hilfe zu Modulen installieren bzw. aktualisieren

# ! Hilfe zu allen Modulen installieren (Admin-Rechte werden benötigt):

Update-Help -Module '*' -UICulture 'en-US' -Force

# * Die Quelle ist das Internet bzw. der im Module (.PSD1) hinterlegte Path (HelpInfoURI). Einige Module haben keinen Path hinterlegt was mit einer Error quittiert wird.

# ! Hilfe auf Nicht-Internet-Fähigen Computern installieren:

# TIPP - Es ist wichtig für ALLE PowerShell-Computer die Hilfe zu installieren, um relevante Informationen auch dort nachschlagen zu können.

# TODO 1. SCHRITT - Auf einem internet-fähigen die Hilfe installieren.

# TODO 2. SCHRITT - Von diesem die Hilfe-Daten kopieren:
Save-Help -DestinationPath 'C:\temp\PSHelpFiles' -Module '*'

# TODO 3. SCHRITT - Von einer lokalten Ort die Hilfe auf dem Ziel-PC installieren:
Update-Help -Module '*' -SourcePath 'C:\temp\PSHelpFiles'

#endregion

#region 2. Hilfe um und zur PowerShell verwenden (about-Seiten)

# Dies so genanten about_-Seiten beschreiben die Mechaniken der PowerShell und erklären Themen wie: if, Remoting, Pipelining, Variablen, etc.

# ! Eine Übersicht / Inhaltsverzeichnis aller about_-Seiten anzeigen:

Get-Help -Name 'about_*'

# ! Den Inhalt konkreter about_-Seiten abrufen:

Get-Help -Name 'about_wildcards' -ShowWindow
Get-Help -Name 'about_if' -ShowWindow

# TIPP about_-Seiten wiederholt lesen, es findet sich darin immer tiefere Informationen.

# ? In allen about-Seiten nach einem Keyword suchen:

Get-Help -Name 'filesystem' -Category 'HelpFile'
Get-Help -Name 'Call operator' -Category 'HelpFile'
Get-About -KeyWord 'parameter' # TODO Module AKPT wird benötigt

#endregion

#region 3. BEFEHLSKONZEPT Command-Let (Cmdlet)

# ! Ein Cmdlet aufrufen:

Start-Process
Microsoft.PowerShell.Management\Start-Process

# ! Cmdlet => Command-Let besteht aus Verb(Verb, Tätigkeit), einem Bindestrich '-' und Substantiv (Noun, Nomen, Tätigkeitsbereich) => Verb-Noun => Verb-Substantiv => Tätigkeit-Tätigkeitsbereich, z.B.:

Get-Service
Stop-Process

# ? Welche Verben/Tätigkeit gibt es:

Get-Verb | Sort-Object -Property 'Verb' | Format-Wide -AutoSize

# TIPP Evtl. als Spickzettel für den Monitor ausdrucken.

# ? Welche Cmdlets stoppen etwas?

Get-Command -Verb 'Stop'

# ? Welche Cmdlets beschäftigen sich mit dem Tätigkeitsbereich Service:

Get-Command -Noun 'Service'

# ! Cmdlets sind keine EXE-Dateien, sie sind *.dll oder in *.ps1 definiert. Cmdlets sind in Module zusammengefasst. Neu Cmdlets können durch die Installation eines Moduls hinzugefügt werden:

Get-Command -Module 'BitLocker'

# ! Ein Cmdlet wird nur über dessen Parameter gesteuert, dabei unterscheidet man Parameter die ein Argument erwarten...:

Get-ChildItem -Path 'C:\Windows' -Filter '*.exe'

# ! ... und SwitchParameter die durch das Setzen das Verhalten des Cmdlets ändern:

Get-ChildItem -Recurse -File

# ! Das Benennen eines Parameters kann vollständig erfolgen. Es kann aber auch soweit verkürzt werden das die rechtlichen Buchstaben weggelassen werden können soweit der Rest eindeutig einem Parameter zugeordnet werden kann:

Get-ChildItem -LiteralPath 'C:\Windows'
Get-ChildItem -Literal 'C:\Windows'
Get-ChildItem -Li 'C:\Windows'
Get-ChildItem -l 'C:\Windows'

# ! Ein Parameter kann auch über dessen Alias angesprochen werden:

Get-ChildItem -PSPath C:\Users -s -ea SilentlyContinue -af -ah -as

# ! Welche Parameter-Aliase ein Cmdlet unterstützt ist in der Cmdlet-Hilfe NICHT immer ersichtlich, aber wie folgt schon:

Get-Command -Name 'Get-ChildItem' | Select-Object -ExpandProperty 'Parameters' |  Select-Object -ExpandProperty 'Values' | Select-Object -Property 'Name', 'Aliases'

# ! Ein Cmdlet kann auch dynamische Parameter besitzen die nur dann zur Verfügung stehen wenn div. Konstellationen eingetreten sind:

Get-ChildItem -Path 'Cert:\CurrentUser\My' -CodeSigningCert
# Den Switch-Parameter '-CodeSigningCert' gibt es nur im PowerShell-Drive 'Cert:'

Get-ChildItem -Path 'C:\Temp' -Directory
# Den Switch-Parameter '-Directory' gibt es nur im PowerShell-Provider 'FileSystem'

#endregion

#region 4. Ein benötigtes Cmdlet finden

# ? Ein Cmdlet über dessen Namen finden:

Get-Command -Name '*-*connection*' -CommandType 'Cmdlet', 'Function'

# TIPP - Ein Cmdlet über die direkte Eingabe und Intellisense vorschlagen lassen z.B. beginnen Sie zu tippen: 'conn' und Intellisense schlägt Cmdlets vor die 'conn' enthalten. [CTRL]+[SPACE] öffnet Intellisense, auch in der Console.

# ? Ein Cmdlet über die Tätigkeit (Verb) finden:

Get-Command -Verb 'Stop'

# ? Ein Cmdlet über den Tätigkeitsbereich (Noun) finden:

Get-Command -Noun 'Computer'
Get-Command -Noun 'Process'
Get-Command -Noun 'Service'

# ? Ein Cmdlet über die Tätigkeit (Verb) und Tätigkeitsbereich (Noun) finden:

Get-Command -Verb 'Get' -Noun '*connection'

# ? Ein Cmdlet über den Parameter-Namen / Parameter Type finden:

Get-Command -Name '*' -ParameterName 'ComputerName'
Get-Command -Name '*' -ParameterType [SecureString] # ! Betrifft nur importierte Module

# ? Sämtliche Cmdlets über den Module-Name finden:


Get-Command -Name '*' -Module 'Defender'

# ? Welche Module sind installiert:

Get-Module -ListAvailable

# ? Ein Cmdlet über die PowerShell Gallery finden:

Invoke-SqlCmd
Find-Command -Name 'Invoke-SqlCmd'

# ? Ein Cmdlet über Show-Command finden:

Show-Command

# ? Ein Cmdlet über Google finden:

Start-Process -FilePath 'https://www.google.com/search?q=powershell+new+ad+user'

# ? Die Suche einschränken auf nur importierte Module:

Get-Command -Name '*' -ListImported

# ? Mehrdeutige Cmdlets auflisten:

$ambivalentCmdlets = Get-Command -Name '*' -All | Group-Object -Property 'Name' | Where-Object -Property 'Count' -GE -Value 2
$ambivalentCmdlets[0].Group

# TIPP Da Get-Command oft temporär verwendet wird ist die Benutzung des Alias gcm effizienter und erlaubt.

gcm

#endregion

#region 5. Hilfe zu einem Cmdlet aufrufen, lesen und anwenden

# ? Kurz-Information bzgl. Syntax anzeigen:

Get-Command -Name 'Get-Process' -Syntax
Get-Command -Name "Enter-PSSession" -Syntax

# ? Ausführliche Informationen bzgl. der Parameter-Metadaten:

Get-Command -Name 'Get-Process' -ShowCommandInfo | Select-Object -ExpandProperty 'ParameterSets' | Format-Table -Wrap

# ? 'Get-Process' => Was mach das Cmdlet und wie wird es benutzt:

Get-Help -Name 'Get-Process' -ShowWindow
Get-Help -Name 'Get-Process' -Online
# TIPP - CTRL + F1 öffnet die Online-Hilfe eines selektiertem Cmdlets (VSCode)

# ? Wie wird am Beispiel von Get-Process der Syntax-Block gelesen:

<#
   1. Get-Process [[-Name] <String[]>] [-ComputerName <String[]>] [-Module ] [-FileVersionInfo ] [<Allgemeine Parameter>]
   2. Get-Process [[-Name] <String[]>] -IncludeUserName [<Allgemeine Parameter>]
   3. Get-Process -Id <Int32[]> [-ComputerName <String[]>] [-Module ] [-FileVersionInfo ] [<Allgemeine Parameter>]
   4. Get-Process -Id <Int32[]> -IncludeUserName [<Allgemeine Parameter>]
   5. Get-Process -InputObject <Process[]> [-ComputerName <String[]>] [-Module ] [-FileVersionInfo ] [<Allgemeine Parameter>]
   6. Get-Process -InputObject <Process[]> -IncludeUserName [<Allgemeine Parameter>]
#>


# ! SECHS Get-Process Syntax-Zeilen, d.h. 6 verschiedene ParameterSet sind möglich. Parameter aus unterschiedlichen Sets dürfen NICHT gemischt werden:
Get-Process                                  # 1. Set wird benutzt
Get-Process -Name 'notepad' -FileVersionInfo # 1. Set wird benutzt
Get-Process -Name 'notepad' -IncludeUserName # 2. Set wird benutzt
Get-Process -Name 'Idle' -Id 0               # ! ERROR
Get-Process -Id 0                            # 3. Set wird benutzt

# ! [-ParaName <...>], d.h. der Parameter mit Argument ist optional:

Get-Process
Get-Process -Name 'notepad'

# ! [[-ParaName] <...>], d.h. der Parameter mit Argument ist optional und der Parametername selbst ist optional:

Get-Process -Name 'notepad'
Get-Process 'notepad'

# ! -Name <String[]>, d.h. dieser Parameter ist pflicht:

Get-Process -Id 0

# ! -ParaName <...> -ParaName <...[]>, d.h. das Parameter-Argument muss vom <...>-Typ sein:

$a = Get-Process -Name 'notepad', 'explorer' # String[] => String-Array

# ! [-ParaName], d.h. der Parameter ist ein Switch-Parameter (setzen = AN; sonst = AUS):

Get-Process -IncludeUserName
Get-Process -IncludeUserName:$false

# ! [<CommonParameters>], d.h. div. Parameter die i.d.R. an alle Cmdlets angehängt werden können (s. about_CommonParameters):

Get-Process -FileVersionInfo -ErrorAction 'SilentlyContinue'
Get-Process -FileVersionInfo -ErrorAction 'Stop'
Get-Process | Stop-Process -Confirm
Get-Process | Stop-Process -WhatIf
# TIPP - Format-Volume -DriveLetter "D" -WhatIf # Das geht nicht, WAI!?

# ! Parameter-Detail-Beschreibung:

# ? Erforderlich => Optional | Pflicht-Parameter
# ? Position => Argument-Position, wenn der Parameter-Name weg gelassen wird
# ? Standardwert => Wert der benutzt wird, wenn der Parameter nicht bedient wird
# ? Pipelineeingaben akzeptieren => Die Art wie Pipeline-Objekte an das Cmdlet gebunden wird
# ? Platzhalterzeichen akzeptieren => Ob Wildcards wie z.B. "*" akzeptiert und als solche behandelt werden

# * Erforderlich? true ODER: false
# * Position? named ODER: 0, 1, 2, 3, 4, 5, usw.
# * Standardwert none ODER: localhost
# * Pipelineeingaben akzeptieren? false ODER: true (ByValue), true (ByPropertyName), true (ByPropertyName, ByValue)
# * Platzhalterzeichen akzeptieren? false ODER: true


# TIPP Get-Help intensiv nutzen!

#endregion

#region Eigene Hilfe-Inhalte erstellen

Get-Help -Name "about_Script_Internationalization" -ShowWindow # Beschreibt die Funktionen zur Internationalisierung von Skripten, die es Skripten erleichtern, Nachrichten und Anweisungen für Benutzer in ihrer Benutzeroberflächensprache anzuzeigen.

Get-Help -Name "about_Data_Sections" -ShowWindow # Erläutert Datenabschnitte, in denen Textzeichenfolgen und andere schreibgeschützte Daten von der Skriptlogik isoliert werden.

# HILFE-ARTEN
# Cmdlet => The Help topics that describe Cmdlets in a module are XML files that use the command help schema
# Provider => The Help topics that describe providers in a module are XML files that use the provider help schema.
# Function => The Help topics that describe functions in a module can be XML files that use the command help schema or comment-based Help topics within the function, or the script or script module
# Script => The Help topics that describe scripts in a module can be XML files that use the command help schema or comment-based Help topics in the script or script module.
# Conceptual ("About") => You can use a conceptual ("about") Help topic to describe the module and its members and to explain how the members can be used together to perform tasks. Conceptual Help topics are text files with Unicode (UTF-8) encoding. The file name must use the about_<name>.help.txt format, such as about_MyModule.help.txt. By default, Windows PowerShell includes over 100 of these conceptual About Help topics, and they are formatted like the following example.

# <ModulePath>
# \<MyModuleName>
# \en-US
# \about_SampleModule.help.txt
# \SampleModule.dll-help.xml
# \fr-FR
# \about_SampleModule.help.txt
# \SampleModule.dll-help.xml

# Supporting Updatable Help
Start-Process "https://msdn.microsoft.com/de-de/library/hh852754(v=vs.85).aspx"

# Supporting Online Help
Start-Process "https://msdn.microsoft.com/de-de/library/hh852737(v=vs.85).aspx"

# PowerShell Cmdlet Help Editor
Start-Process "https://pscmdlethelpeditor.codeplex.com"

#endregion

# TODO QUIZ - https://forms.office.com/Pages/ResponsePage.aspx?id=DQSIkWdsW0yxEjajBLZtrQAAAAAAAAAAAAa__Yp1xwFUNks0R0pORFo1WEFRWk1CRjlRSFM5SlY4Ny4u

<# TODO ÜBUNG
 
1. Berechnen Sie mit dem Cmdlet New-TimeSpan wieviele Tage es noch bis Neujahr ist.
 
2. Finden Sie heraus ob bereits eine Instanz vom Taschenrechner ausgeführt wird.
 
3. Erzeugen Sie mit Get-EventLog eine Übersicht der 10 neusten Fehler aus der Windows-Ereignisanzeige "System".
 
4.a. Was bewirkt die folgende Kommando-Zeile?
 
gci "C:\Windows\Logs" -Rec -File -errora "SilentlyContinue"
 
4.b. ... und geht das noch kürzer?
 
5. Warum wird das 1. ParameterSet bei folgendem Aufruf benutzt:
 
Get-Process -Name 'notepad' -FileVersionInfo
#>