Personalizar o seu ambiente de shell

Um perfil do PowerShell é um script que é executado quando o PowerShell é iniciado. Pode utilizar o perfil para personalizar o ambiente. Pode:

  • adicionar aliases, funções e variáveis
  • carregar módulos
  • criar unidades do PowerShell
  • executar comandos arbitrários
  • e alterar as definições de preferência

Colocar estas definições no seu perfil garante que estão disponíveis sempre que iniciar o PowerShell no seu sistema.

Nota

Para executar scripts no Windows, a política de execução do PowerShell tem de ser definida como RemoteSigned no mínimo. As políticas de execução não se aplicam a macOS e Linux. Para obter mais informações, veja about_Execution_Policy.

A variável $PROFILE

A $PROFILE variável automática armazena os caminhos para os perfis do PowerShell que estão disponíveis na sessão atual.

Existem quatro perfis possíveis disponíveis para suportar diferentes âmbitos de utilizador e diferentes anfitriões do PowerShell. Os caminhos completamente qualificados para cada script de perfil são armazenados nas seguintes propriedades de membro de $PROFILE.

  • AllUsersAllHosts
  • AllUsersCurrentHost
  • CurrentUserAllHosts
  • CurrentUserCurrentHost

Pode criar scripts de perfil que são executados para todos os utilizadores ou apenas para um utilizador, o CurrentUser. Os perfis CurrentUser são armazenados no diretório raiz do utilizador.

Também existem perfis que são executados para todos os anfitriões do PowerShell ou anfitriões específicos. O script de perfil para cada anfitrião do PowerShell tem um nome exclusivo para esse anfitrião. Por exemplo, o nome de ficheiro do Anfitrião de Consola padrão no Windows ou a aplicação de terminal predefinida noutras plataformas é Microsoft.PowerShell_profile.ps1. Para o Visual Studio Code (VS Code), o nome de ficheiro é Microsoft.VSCode_profile.ps1.

Para obter mais informações, veja about_Profiles.

Por predefinição, referenciar a $PROFILE variável devolve o caminho para o perfil "Utilizador Atual, Anfitrião Atual". O caminho dos outros perfis pode ser acedido através das propriedades da $PROFILE variável. Por exemplo:

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

Como criar o seu perfil pessoal

Quando instala o PowerShell pela primeira vez num sistema, os ficheiros de script de perfil e os diretórios aos quais pertencem não existem. O comando seguinte cria o ficheiro de script de perfil "Utilizador Atual, Anfitrião Atual", se não existir.

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

O parâmetro Force do New-Item cmdlet cria as pastas necessárias quando não existem. Depois de criar o ficheiro de script, pode utilizar o seu editor favorito para personalizar o seu ambiente de shell.

Adicionar personalizações ao seu perfil

Os artigos anteriores falaram sobre a utilização da conclusão de separadores, preditores de comandos e aliases. Estes artigos mostraram os comandos utilizados para carregar os módulos necessários, criar preenchimentos personalizados, definir keybindings e outras definições. Estes são os tipos de personalizações que pretende ter disponíveis em todas as sessões interativas do PowerShell. O script de perfil é o local para estas definições.

A forma mais simples de editar o script de perfil é abrir o ficheiro no seu editor de código favorito. Por exemplo, o seguinte comando abre o perfil no VS Code.

code $PROFILE

Também pode utilizar notepad.exe no Windows, vi no Linux ou em qualquer outro editor de texto.

O seguinte script de perfil tem exemplos para muitas das personalizações mencionadas nos artigos anteriores. Pode utilizar qualquer uma destas definições no seu próprio perfil.

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

Este script de perfil fornece exemplos para a seguinte personalização:

  • Adiciona dois novos PSDrives para as outras hives de registo de raiz.
  • Cria um pedido personalizado que é alterado se estiver em execução numa sessão elevada.
  • Configura o PSReadLine e adiciona o encadeamento de chaves. As definições de cor utilizam a funcionalidade $PSStyle para definir as definições de cor ANSI.
  • Adiciona a conclusão do separador para a ferramenta da CLI dotnet . A ferramenta fornece parâmetros para ajudar a resolver os argumentos da linha de comandos. O bloco de script para Register-ArgumentCompleter utiliza essa funcionalidade para fornecer a conclusão do separador.