Читать книгу PowerShell 7 und Windows PowerShell - Tobias Weltner - Страница 102
Listing 1.15: Ein Beispiel-Profilskript für PowerShell
ОглавлениеFalls Sie allerdings mit Windows arbeiten und sowohl Windows PowerShell als auch PowerShell abwechselnd oder je nach Szenario nutzen, werden Sie schnell feststellen, dass diese beiden PowerShell-Varianten ihre Profilskripte an unterschiedlichen Orten speichern. Das ist keine Katastrophe, aber Sie müssten nun Ihre Anpassungen in zwei separaten Profilskripten pflegen, also Listing 1.14 jeweils einmal in Windows PowerShell und einmal in PowerShell ausführen und danach dafür sorgen, dass beide Dateien denselben Inhalt haben.
Theoretisch kann das sogar sinnvoll sein, denn vielleicht wollen Sie bei den beiden PowerShellVarianten unterschiedliche Starteinstellungen vorgeben. Die meisten Anwender allerdings haben das nicht vor. Hier wäre ein gemeinsames Profilskript eigentlich die bessere Wahl.
Und genau das funktioniert auch, jedenfalls sofern Sie Administratorrechte besitzen. Dann nämlich können Sie für das PowerShell-Profilskript einen sogenannten Hard Link verwenden, der wie eine normale Datei aussieht, in Wirklichkeit aber auf die Profildatei von Windows PowerShell verweist. Sobald eine der beiden Dateien geändert wird, ändert sich auch die andere – ganz von allein.
So eine Spiegelung richtet Listing 1.16 ein:
#requires -RunAsAdministrator
# Hard Links können nur als Administrator angelegt werden.
# Dieses Skript ist nur sinnvoll, wenn das Betriebssystem "Windows" ist:
if ($isWindows -eq $false)
{
Write-Warning "Spiegeln der Profile ist nur bei Windows möglich."
Write-Warning "Andere Betriebssysteme verfügen über kein Windows PowerShell"
return
}
# Sicherstellen, dass die Windows PowerShell-Profildatei existiert:
if ($PSVersionTable.PSEdition -eq 'Core')
{
# Pfad zum Windows PowerShell-Profilskript berechnen:
$winprofile = $profile.CurrentUserAllHosts -replace '\\PowerShell\\', '\WindowsPowerShell\'
$coreprofile = $profile
}
else
{
# Pfad steht bei Windows PowerShell schon in $profile:
$winprofile = $profile.CurrentUserAllHosts
$coreprofile = $profile -replace '\\WindowsPowerShell\\','\PowerShell\'
}
# Datei anlegen, wenn noch nicht vorhanden:
$exists = Test-Path -Path $winprofile
if ($exists -eq $false)
{
$null = New-Item -Path $winprofile -ItemType File -Force
Write-Warning "Profilskript für Windows PowerShell angelegt."
}
else
{
Write-Warning "Profilskript für Windows PowerShell war vorhanden."
}
# Testen, ob Profilskript für PowerShell existiert:
$exists = Test-Path -Path $coreprofile
if ($exists)
{
# Ist die Profildatei vielleicht bereits gespiegelt?
$datei = Get-Item -Path $coreprofile
if ($datei.LinkType -eq 'HardLink')
{
# Wir sind fertig.
Write-Warning 'Profildatei von Windows PowerShell wird bereits mitgenutzt (keine
Änderungen).'
# Profilskript im Editor öffnen:
Invoke-Item -Path $winprofile
Return
}
else
{
# Wenn PowerShell bereits eine eigene Profildatei verwendet, muss diese
# gelöscht werden, um stattdessen auf das Windows-Profil zu verweisen.
# Also nachfragen, ob der User das will:
Write-Warning 'Profilskript für PowerShell ist bereits als separate Datei vorhanden.'
Write-Warning 'Soll dieses Profil gelöscht und stattdessen das Profil der Windows
PowerShell verwendet werden?'
# Frage stellen und 20 Sekunden warten, danach "NEIN" wählen:
choice.exe /C JN /M "Drücken Sie J für Ja oder N für Nein" /T 20 /D N
# choice.exe liefert einen ErrorLevel in $LastExitCode zurück, der
# Zahlenwert entspricht der Auswahl (1=Ja, 2=Nein).
if ($LASTEXITCODE -eq 2) { return }
# Profildatei löschen.
Remove-Item -Path $coreprofile -Force
}
}
# Hard Link anlegen (erfordert Administratorrechte)
$null = New-Item -Path $coreprofile -ItemType HardLink -Value $winprofile
Write-Warning 'Profildatei von Windows PowerShell wird nun mitgenutzt.'
Write-Warning "Um die Spiegelung aufzuheben, einfach die $profile löschen und von Hand oder im Editor
neu angelegen."
# Profilskript im Editor öffnen:
Invoke-Item -Path $winprofile