de-DE/tutorials/Invoke-PSProfileTutorial.ps1

#an interactive tutorial for PowerShell profiles

param(
    [switch]$Full,
    [switch]$Menu
)

#region setup
$script:tutorialParam = $PSBoundParameters
$title = "$($titleStyle)$($strings.profileTutorialTitle)$reset"
if ($IsCoreCLR) {
    $psh = 'pwsh'
}
else {
    $psh = 'powershell'
}

#endregion

#region content

$intro = @"
 
Ein häufiges PowerShell-Thema, über das Sie lesen und sprechen hören werden, ist die Verwendung eines
PowerShell-{0}Profilskripts{1}. Dies ist eine besondere Art von Skriptdatei, die zum Konfigurieren Ihrer
PowerShell-Sitzung verwendet wird.
 
Möchten Sie immer, dass eine bestimmte Variable oder ein neues PSDrive definiert ist, wenn Sie PowerShell
starten? Anstatt die Befehle jedes Mal manuell auszuführen, wenn Sie eine neue PowerShell-Sitzung starten,
können Sie sie in ein PowerShell-Profilskript legen und sie werden automatisch ausgeführt, wenn Sie
eine PowerShell-Sitzung starten.
 
Es gibt jedoch tatsächlich eine Hierarchie von PowerShell-Profilskripten, die PowerShell-Einsteiger
verwirrend finden. Und auf Windows-Plattformen gibt es ein weiteres potenzielles Hindernis, dem Sie begegnen
könnten.
 
"@
 -f $highLight, $reset

#what is a profile script
$p1 = @"
Ein PowerShell-Profilskript ist wie jedes andere Skript. Es ist eine Textdatei mit der Dateierweiterung {5}.ps1{3}.
Der Inhalt der Skriptdatei sind die gleichen Befehle, die Sie interaktiv ausführen können.
 
Beispielsweise könnten Sie diese Zeile in einer PowerShell-Sitzung ausführen, um eine Variable zu definieren.
 
$prompt {0}`$CustomVar{3}{1} ={3} {2}'foo789'{3}
 
Sie könnten denselben Befehl verwenden:
 
{0}`$CustomVar{3}{1} ={3} {2}'foo789'{3}
 
und ihn in ein PowerShell-Profilskript einfügen. Da PowerShell-Profilskripte {4}automatisch{3}
ausgeführt werden, wenn Sie eine neue PowerShell-Sitzung starten, wäre diese Variable in Ihrer Sitzung definiert.
 
$prompt {0}`$CustomVar{3}
foo789
 
"@
 -f $varStyle, $operatorStyle, $stringStyle, $reset, $highLight3, $highLight2

#powershell versions
$p2 = @"
 
Auf Windows-Plattformen ist es möglich, Windows PowerShell und PowerShell 7 nebeneinander auszuführen.
Jede Version hat {0}ihren eigenen Satz{1} von Profilskripten. Das bedeutet, dass eine Konfiguration, die für
Windows PowerShell erstellt wurde, standardmäßig {2}nicht{1} in PowerShell 7 verwendet wird.
 
Nicht-Windows-Plattformen können nur PowerShell 7 ausführen, daher ist dies auf diesen Systemen kein Problem.
 
"@
 -f $highLight, $reset, $warnStyle

#hosting
$p3 = @"
Bevor wir in die technischen Details einsteigen, müssen Sie einen oft übersehenen Aspekt von PowerShell
verstehen. Wir neigen dazu, die Befehle und den Code, aus denen PowerShell besteht, als {0}Verwaltungsmotor{1}
zu betrachten. Wie ein Automotor ist er für sich genommen nutzlos. Er muss Teil einer größeren Konstruktion
sein. In der Automobilwelt würden wir den Motor in ein Auto oder einen Lkw einbauen. In PowerShell
muss der Motor in einer Anwendung {2}gehostet{1} werden.
 
Dies wird als {3}Hosting-Anwendung{1} oder Host bezeichnet.
 
Sie können die Anwendung, die Ihre PowerShell-Sitzung hostet, anzeigen, indem Sie {4}Get-Host{1} ausführen.
 
$prompt {4}Get-Host{1}
"@
 -f $highLight2, $reset, $highLight3, $highlight, $cmdStyle

$p4 = @"
Oder Sie können die integrierte Variable {0}`$host{1} verwenden.
 
$prompt {0}`$host{1}
 
"@
 -f $varStyle, $reset

#other apps like VSCode
$p5 = @"
Die meiste Zeit werden Sie im ConsoleHost verbringen. Denken Sie daran als das Standard-oder
Standarde-Erlebnis von PowerShell. Andere Anwendungen können PowerShell jedoch ebenfalls hosten.
Wenn Sie sich in einer entfernten PowerShell-Sitzung über das WSMan-Protokoll befinden, ist dies
eine weitere Hosting-Anwendung.
 
Zwei häufige Beispiele für andere Hosts, auf die Sie wahrscheinlich stoßen werden, sind PowerShell ISE
und das integrierte Terminal in Visual Studio Code. Sie können dies überprüfen, indem Sie {2}Get-Host{1}
ausführen oder einfach den Hostnamen anzeigen.
 
Das folgende Beispiel ist das, was Sie in Visual Studio Code sehen würden.
 
$prompt {3}`$host.name{1}
Visual Studio Code Host
 
Es ist wichtig, dass Sie das Konzept einer Hosting-Anwendung verstehen, da es {4}keine Garantie gibt,
dass alle PowerShell-Funktionen in allen Hosts unterstützt werden{1}.
 
"@
 -f $italic, $reset, $cmdStyle, $varStyle, $warnStyle

#scope
$p6 = @"
Bisher haben wir uns die PowerShell-Version und den Host angesehen. Es gibt ein weiteres PowerShell-Attribut,
das Profilskripte beeinflusst, und das ist der {0}Scope{1}. Denken Sie daran als Einflussbereich.
 
Bei Profilskripten gibt es zwei Scopes. Es gibt einen Scope für {2}AllUsers{1} und einen für den
{3}CurrentUser{1}.
 
Der Scope {2}AllUsers{1} gilt für jeden PowerShell-Benutzer. Dieser Scope wird auf Systemebene angewendet,
typischerweise dort, wo sich die PowerShell-Programmdateien befinden. Sie benötigen erhöhte Rechte,
um Dinge auf dieser Ebene zu verwalten.
 
Der Scope {3}CurrentUser{1} sind in der Regel Sie. Dieser Scope basiert auf Ihrem Desktop-Profil, was bedeutet,
dass Sie keine besonderen Rechte benötigen.
 
"@
 -f $highLight, $reset, $highLight2, $highLight3

#$profile

$p7 = @"
Auch wenn PowerShell-Profilskripte .ps1-Dateien sind, sind die Pfade {0}fest codiert{1} und {2}können nicht
geändert werden.{1} Wenn Sie eine PowerShell-Sitzung starten, sucht PowerShell nach den Profilskripten und
führt sie automatisch aus.
 
Sie können die integrierte Variable {3}`$profile{1} verwenden, um den Speicherort anzuzeigen.
 
$prompt {3}`$profile{1}
"@
 -f $highLight3, $reset, $warnStyle, $varStyle

$p8 = @"
Sie sollten feststellen, dass der Pfad auf Ihr Benutzerprofil verweist. Es ist wichtig zu beachten,
dass diese Datei {0}standardmäßig nicht existiert{1}. Es ist auch möglich, dass einige Teile
des Pfads nicht vorhanden sind.
 
"@
 -f $warnStyle, $reset

$p9 = @"
Die Variable {0}`$profile{1} ist etwas komplizierter, als sie scheint. Es gibt zusätzliche Eigenschaften,
die die Scopes der Profilskripte widerspiegeln.
 
$prompt {0}`$profile{1} {3}|{1} {2}Select-Object{1} {4}*host*{1} {3}|{1} {2}Format-List{1}
"@
 -f $varStyle, $reset, $cmdStyle, $defaultTokenStyle, $stringStyle

$p10 = @"
 
Technisch gesehen gibt es {5}vier{0} PowerShell-Profilskripte. Sie können sie hier mit ihren fest
codierten Pfaden sehen. {6}Keines dieser Profilskripte existiert standardmäßig.{0}
 
Für alle gefundenen Skripte führt PowerShell sie in dieser Reihenfolge aus, beginnend mit dem
breitesten Scope und hin zum engsten. Denken Sie daran, dass der {1}Host{0} die Hosting-Anwendung ist,
wie der {2}ConsoleHost{0} oder der {3}Visual Studio Code Host{0}.
 
Wenn Sie mehrere Profilskripte verwenden, ist die Wirkung {4}kumulativ{0}.
 
"@
 -f $reset, $highLight, $highLight2, $highLight3, $underLine, $italic, $warnStyle

#checking status
$p11 = @"
Das Modul {1}PSIntro{0} enthält einen Befehl, mit dem Sie leicht sehen können, ob PowerShell-Profilskripte
existieren. Orte ohne Skriptdatei sollten in Rot angezeigt werden.
 
$prompt {2}Get-ProfileStatus{0}
 
"@
 -f $reset, $highLight2, $cmdStyle

#creating a profile script

$p12 = @"
Sie können jedes PowerShell-Profilskript manuell mit dem angegebenen Pfad und Dateinamen erstellen.
Auf Nicht-Windows-Computern achten Sie auf die Groß- und Kleinschreibung. Oder Sie können PowerShell
und die Variable {1}`$profile{0} verwenden. Sie können auf die verschiedenen Profilskripte als
Objekteigenschaften verweisen. Verwenden Sie den Befehl {2}New-Item{0}, um die Datei zu erstellen.
 
Das Beispiel verwendet den Parameter {3}-WhatIf{0}, um zu zeigen, was PowerShell getan hätte, ohne die
Datei tatsächlich zu erstellen. Verwenden Sie {3}-Force{0}, um fehlende Teile des Pfads zu erstellen.
 
$prompt {2}New-Item{0} {3}-path{0} {4}`$profile.CurrentUserCurrentHost{0} {3}-Force -WhatIf{0}
"@
 -f $reset, $varStyle, $cmdStyle, $paramStyle, $varStyle

$p13 = @"
Sobald das Skript erstellt wurde, bearbeiten Sie es mit Ihrem bevorzugten Code-Editor. Verwenden Sie
größtenteils PowerShell-Befehle, die ohne Benutzereingriff ausgeführt werden. Die Skripte laufen
automatisch {1}unter Ihrem Benutzerkontext{0}, wenn Sie PowerShell starten, daher ist es wichtig, dass
Sie sie sicher halten. Code-Signierung liegt außerhalb des Umfangs dieses Tutorials, könnte aber etwas
sein, das Sie für Ihre Profilskripte in Betracht ziehen sollten.
 
Geben Sie in Ihr Profilskript Befehle ein, die für die PowerShell-Version und den Host geeignet sind.
Befehle in Ihrem Skript werden von Anfang bis Ende ausgeführt.
 
Sie möchten vielleicht eine Variable definieren, die Sie oft verwenden werden:
 
{2}`$zip = 68106{0}
 
Sie können ein PSDrive definieren:
 
{2}New-PSDrive -Name W -PSProvider FileSystem -Root c:\work{0}
 
Auch wenn PowerShell Module automatisch lädt, möchten Sie sie vielleicht in Ihrem Profil vorladen:
 
{2}Import-Module Microsoft.PowerShell.PSResourceGet{0}
 
Oder vielleicht möchten Sie eine benutzerdefinierte Funktion definieren:
 
{2}Function Get-SessionRunTime {{
    `$thisSession = Get-Process -id `$pid
    `$ts = New-TimeSpan -start `$thisSession.StartTime -end (Get-Date)
    `$ts.ToString()
}}{0}
 
Sie möchten vielleicht auch Befehls-Aliase hinzufügen
 
{2}Set-Alias -name rt -value Get-SessionRunTime{0}
{2}Set-Alias -name dt -value Get-Date{0}
 
"@
 -f $reset, $highLight3, $stringStyle

$p14 = @"
Sie könnten versucht sein, Anmeldeinformationen in Ihr PowerShell-Profilskript einzutragen. Aber seien
 Sie vorsichtig.
 
{1}Legen Sie niemals Klartext-Passwörter in eine PowerShell-Skriptdatei{0}
 
Sie {2}könnten{0} {3}Get-Credential{0} verwenden und in Ihrem Profilskript nach Anmeldeinformationen fragen:
 
{4}`$admin = Get-Credential company\administrator{0}
 
Das funktioniert, aber Sie werden jedes Mal aufgefordert, wenn PowerShell mit Ihrem Profil startet. Es
liegt außerhalb des Umfangs dieses Tutorials, aber Sie sollten untersuchen, wie Sie das Modul
{5}Microsoft.PowerShell.SecretManagement{0} von Microsoft verwenden können.
 
Sie können mehr erfahren, indem Sie besuchen:
 
https://learn.microsoft.com/powershell/module/microsoft.powershell.secretmanagement/?view=ps-modules
 
"@
 -f $reset, $warnStyle, $italic, $cmdStyle, $stringStyle, $highLight2

#execution policy
$p15 = @"
Auf {5}Windows{0}-Systemen gibt es ein weiteres potenzielles Hindernis für die Verwendung von
PowerShell-Profilskripten, und das ist die {3}Ausführungsrichtlinie{0}. Die Ausführungsrichtlinie
von PowerShell soll die {4}unbeabsichtigte{0} Ausführung eines PowerShell-Skripts verhindern. Eine der
Richtlinien ist {6}Restricted{0}, die PowerShell daran hindert, jede Skriptdatei auszuführen, zu der
auch PowerShell-Profilskripte gehören.
 
Führen Sie {2}Get-ExecutionPolicy{0} aus, um Ihre aktuelle Einstellung zu sehen.
 
$prompt {2}Get-ExecutionPolicy{0}
"@
 -f $reset, $cmdStyle, $paramStyle, $highLight3, $highLight, $highLight2, $warnStyle

$p16 = @"
Wenn die Einstellung auf {1}Restricted{0} gesetzt ist, müssen Sie sie mit {2}Set-ExecutionPolicy{0} ändern.
Die empfohlene Mindesteinstellung ist {4}RemoteSigned{0}.
 
$prompt {2}Set-ExecutionPolicy{0} {3}RemoteSigned{0}
 
Sie müssen dies nur einmal festlegen. Beachten Sie, dass diese Einstellung in Unternehmensumgebungen
durch Gruppenrichtlinien gesteuert oder anderweitig eingeschränkt sein kann.
 
Lesen Sie das Hilfethema {3}about_Execution_Policies{0}, um mehr zu erfahren:
 
$prompt {2}help{0} {3}about_Execution_Policies{0}
 
"@
 -f $reset, $warnStyle, $cmdStyle, $stringStyle, $highLight3, $highLight2

#pwsh -noProfile
#help about_profiles
$p17 = @"
Da Ihr PowerShell-Profilskript erhebliche Änderungen an Ihrer Sitzung vornehmen könnte oder
wenn Sie PowerShell beheben müssen, kann es Situationen geben, in denen Sie eine saubere PowerShell-Sitzung
ohne Laden Ihres Profils starten möchten. Sie können Parameter für das PowerShell-Programm verwenden,
um eine neue Sitzung ohne Profil zu starten:
 
$prompt {1}$psh{0} {2}-NoProfile{0}
 
Um andere verfügbare Parameter und Hilfe zu sehen, führen Sie aus:
 
$prompt {1}$psh{0} {2}-?{0}
 
"@
 -f $reset, $cmdStyle, $paramStyle

$p18 = @"
 
Um noch mehr über PowerShell-Profile zu erfahren, lesen Sie die Hilfe:
 
$prompt {1}help{0} {2}about_Profiles{0}
 
"@
 -f $reset, $cmdStyle, $stringStyle

#endregion

#region run

$pages = @(
    {
        Clear-Host
        $title
        $Intro
        $script:pg++ ; Pause $script:pg $pgCount
    },
    {
        Clear-Host
        $p1
        $script:pg++ ; Pause $script:pg $pgCount
    },
    {
        Clear-Host
        $p2
        $script:pg++ ; Pause $script:pg $pgCount
    },
    {
        $p3
        Get-Host
        $script:pg++ ; Pause $script:pg $pgCount
    },
    {
        Clear-Host
        $p4
        $host
        $script:pg++ ; Pause $script:pg $pgCount
    },
    {
        Clear-Host
        $p5
        $script:pg++ ; Pause $script:pg $pgCount
    },
    {
        Clear-Host
        $p6
        $script:pg++ ; Pause $script:pg $pgCount
    },
    {
        Clear-Host
        $p7
        $profile.CurrentUserCurrentHost
        "`n"
        $script:pg++ ; Pause $script:pg $pgCount
    },
    {
        $p8
        Pause $script:pg $pgCount
    },
    {
        Clear-Host
        $p9
        $profile | Select-Object *host* | Format-List | Out-Host
        $script:pg++ ; Pause $script:pg $pgCount
    },
    {
        $p10
        $script:pg++ ; Pause $script:pg $pgCount
    },
    {
        Clear-Host
        $p11
        Get-ProfileStatus -verbose:$false | Out-Host
        $script:pg++ ; Pause $script:pg $pgCount
    },
    {
        Clear-Host
        $p12
        New-Item -Path $profile.CurrentUserCurrentHost -Force -WhatIf
        "`n"
        $script:pg++ ; Pause $script:pg $pgCount
    },
    {
        Clear-Host
        $p13
        $script:pg++ ; Pause $script:pg $pgCount
    },
    {
        Clear-Host
        $p14
        $script:pg++ ; Pause $script:pg $pgCount
    },
    {
        Clear-Host
        $p15
        Get-ExecutionPolicy | Out-Host
        "`n"
        $script:pg++ ; Pause $script:pg $pgCount
    },
    {
        $p16
        $script:pg++ ; Pause $script:pg $pgCount
    },
    {
        Clear-Host
        $p17
        &$psh -? | Select-Object -First 12
        "`t...`n"
        $script:pg++ ; Pause $script:pg $pgCount
    },
    {
        $p18
        $script:pg++ ; Pause $script:pg $pgCount
    }
)
#keep a navigation page counter
$pgCount = $pages.count -1
<#
There is an overlap in functionality between $i and $pg but they are
separate counters because there may be times I need to display a "page"
of information into two pages and want to maintain a page number.
#>

for ($script:i = 0;$script:i -lt $pages.count;$script:i++) {
    Invoke-Command -ScriptBlock $pages[$script:i]
}

#endregion

#this should come after Get-Member and be the last tutorial
if ($full) {
    #this is the last lesson in the set. No action needed.
}
elseif ($menu) {
    Start-PSTutorial
}