Anpassa gränssnittsmiljön

En PowerShell-profil är ett skript som körs när PowerShell startar. Du kan använda profilen för att anpassa miljön. Du kan:

  • lägga till alias, funktioner och variabler
  • läsa in moduler
  • skapa PowerShell-enheter
  • köra godtyckliga kommandon
  • och ändra inställningsinställningar

Om du placerar de här inställningarna i din profil ser du till att de är tillgängliga när du startar PowerShell i systemet.

Kommentar

Om du vill köra skript i Windows måste PowerShell-körningsprincipen vara inställd RemoteSigned på minst. Körningsprinciper gäller inte för macOS och Linux. Mer information finns i about_Execution_Policy.

Variabeln $PROFILE

Den $PROFILE automatiska variabeln lagrar sökvägarna till de PowerShell-profiler som är tillgängliga i den aktuella sessionen.

Det finns fyra tillgängliga profiler som stöder olika användaromfattningar och olika PowerShell-värdar. De fullständigt kvalificerade sökvägarna för varje profilskript lagras i följande medlemsegenskaper för $PROFILE.

  • AllUsersAllHosts
  • AllUsersCurrentHost
  • CurrentUserAllHosts
  • CurrentUserCurrentHost

Du kan skapa profilskript som körs för alla användare eller bara en användare, CurrentUser. CurrentUser-profiler lagras i användarens hemkatalog.

Det finns också profiler som körs för alla PowerShell-värdar eller specifika värdar. Profilskriptet för varje PowerShell-värd har ett namn som är unikt för den värden. Filnamnet för standardkonsolvärden i Windows eller standardterminalprogrammet på andra plattformar är Microsoft.PowerShell_profile.ps1till exempel . För Visual Studio Code (VS Code) är Microsoft.VSCode_profile.ps1filnamnet .

Mer information finns i about_Profiles.

Om du refererar till variabeln $PROFILE returneras som standard sökvägen till profilen "Aktuell användare, aktuell värd". Den andra profilsökvägen kan nås via egenskaperna för variabeln $PROFILE . Till exempel:

PS> $PROFILE
C:\Users\user1\Documents\PowerShell\Microsoft.PowerShell_profile.ps1
PS> $PROFILE.AllUsersAllHosts
C:\Program Files\PowerShell\7\profile.ps1

Så här skapar du din personliga profil

När du först installerar PowerShell på ett system finns inte profilskriptfilerna och de kataloger som de tillhör. Följande kommando skapar profilskriptfilen "Aktuell användare, aktuell aktuell värd" om den inte finns.

if (!(Test-Path -Path $PROFILE)) {
  New-Item -ItemType File -Path $PROFILE -Force
}

Force-parametern New-Itemför cmdleten skapar de nödvändiga mapparna när de inte finns. När du har skapat skriptfilen kan du använda din favoritredigerare för att anpassa shell-miljön.

Lägga till anpassningar i din profil

I de föregående artiklarna talades det om att använda tabbavslut, kommandoförsägare och alias. De här artiklarna visade de kommandon som används för att läsa in de moduler som krävs, skapa anpassade slutförare, definiera nyckelbindningar och andra inställningar. Det här är de typer av anpassningar som du vill ha tillgängliga i varje interaktiv PowerShell-session. Profilskriptet är platsen för de här inställningarna.

Det enklaste sättet att redigera ditt profilskript är att öppna filen i din favoritkodredigerare. Följande kommando öppnar till exempel profilen i VS Code.

code $PROFILE

Du kan också använda notepad.exe i Windows, vi i Linux eller någon annan textredigerare.

Följande profilskript innehåller exempel på många av de anpassningar som nämns i föregående artiklar. Du kan använda någon av de här inställningarna i din egen profil.

## Map PSDrives to other registry hives
if (!(Test-Path HKCR:)) {
    $null = New-PSDrive -Name HKCR -PSProvider Registry -Root HKEY_CLASSES_ROOT
    $null = New-PSDrive -Name HKU -PSProvider Registry -Root HKEY_USERS
}

## Customize the prompt
function prompt {
    $identity = [Security.Principal.WindowsIdentity]::GetCurrent()
    $principal = [Security.Principal.WindowsPrincipal] $identity
    $adminRole = [Security.Principal.WindowsBuiltInRole]::Administrator

    $prefix = $(if (Test-Path variable:/PSDebugContext) { '[DBG]: ' }
                elseif ($principal.IsInRole($adminRole)) { "[ADMIN]: " }
                else { '' })
    $body = 'PS ' + $(Get-Location)
    $suffix = $(if ($NestedPromptLevel -ge 1) { '>>' }) + '> '
    $prefix + $body + $suffix
}

## Create $PSStyle if running on a version older than 7.2
## - Add other ANSI color definitions as needed

if ($PSVersionTable.PSVersion.ToString() -lt '7.2.0') {
    # define escape char since "`e" may not be supported
    $esc = [char]0x1b
    $PSStyle = [pscustomobject]@{
        Foreground = @{
            Magenta = "${esc}[35m"
            BrightYellow = "${esc}[93m"
        }
        Background = @{
            BrightBlack = "${esc}[100m"
        }
    }
}

## Set PSReadLine options and keybindings
$PSROptions = @{
    ContinuationPrompt = '  '
    Colors             = @{
        Operator         = $PSStyle.Foreground.Magenta
        Parameter        = $PSStyle.Foreground.Magenta
        Selection        = $PSStyle.Background.BrightBlack
        InLinePrediction = $PSStyle.Foreground.BrightYellow + $PSStyle.Background.BrightBlack
    }
}
Set-PSReadLineOption @PSROptions
Set-PSReadLineKeyHandler -Chord 'Ctrl+f' -Function ForwardWord
Set-PSReadLineKeyHandler -Chord 'Enter' -Function ValidateAndAcceptLine

## Add argument completer for the dotnet CLI tool
$scriptblock = {
    param($wordToComplete, $commandAst, $cursorPosition)
    dotnet complete --position $cursorPosition $commandAst.ToString() |
        ForEach-Object {
            [System.Management.Automation.CompletionResult]::new($_, $_, 'ParameterValue', $_)
        }
}
Register-ArgumentCompleter -Native -CommandName dotnet -ScriptBlock $scriptblock

Det här profilskriptet innehåller exempel på följande anpassning:

  • Lägger till två nya PSDrive för de andra rotregisterdatafilerna.
  • Skapar en anpassad fråga som ändras om du kör i en upphöjd session.
  • Konfigurerar PSReadLine och lägger till nyckelbindning. Färginställningarna använder funktionen $PSStyle för att definiera inställningarna för ANSI-färg.
  • Lägger till flikavslut för dotnet CLI-verktyget . Verktyget innehåller parametrar som hjälper dig att lösa kommandoradsargumenten. Skriptblocket för Register-ArgumentCompleter använder den funktionen för att tillhandahålla flikens slutförande.