Inspirado pelo post do Scott Hanselman sobre o Solarized, resolvi fazer algumas alterações na minha configuração do PowerShell.

Se você não leu o post do Scott, faça isso agora. Eu espero. 😉

Agora, eis o que eu queria fazer:

Já há muito tempo que havia configurado meu PowerShell para mostrar o prompt elevado (“modo Administrador”) com uma cor diferente, para ficar fácil de distinguir e evitar executar comandos perigosos no lugar errado.

Para isso, eu tinha o seguinte comando no meu perfil do PowerShell:

if (Test-IsAdmin)
{
    $host.UI.RawUI.BackgroundColor = [System.ConsoleColor]::DarkRed
    Clear-Host
}

A função Test-Admin acima não existe no PowerShell. Ela serve para ver se o prompt está elevado ou não. O código dela (que coloquei também no meu perfil do PowerShell) é:

Function Test-IsAdmin
{
    $identity = [Security.Principal.WindowsIdentity]::GetCurrent()
    $principal = New-Object Security.Principal.WindowsPrincipal $identity
    
    return $principal.IsInRole([Security.Principal.WindowsBuiltinRole]::Administrator)
}

O que essa função faz é verificar se o token do usuário atual contém o grupo Administrators. Isso só acontece num processo elevado (ou se o UAC estiver desligado). Nesse caso, mudo a cor de fundo da tela para vermelho e apago a tela para aplicar a alteração.

Mudando para Solarized

Com a inspiração do post do Scott, resolvi adotar o Solarized no meu PowerShell. A ideia era usar o tema escuro para o prompt normal, enquanto o tema claro substituiria meu prompt vermelho para o terminal elevado/administrativo.

O processo para isso tem três partes:

1) Mudar a configuração padrão do CMD

Primeira coisa a fazer. Configure o default do CMD – você pode precisar para as situações (raras) em que você roda o PowerShell a partir do CMD. Além disso, dá uma certa consistência aos meus terminais (CMD e PS ficam com a mesma cor).

Para isso, importe o arquivo solarized-dark.reg no seu Windows. Isso faz com que a cor-padrão do seu console seja a definida no Solarized Dark.

2) Alterar seu perfil do PowerShell

A segunda parte da configuração precisa ser feita no perfil do PowerShell. Com ela, cada vez que um prompt é aberto ele carrega as cores do Solarized. Baixe os arquivos Set-SolarizedDarkColorDefaults.ps1 e Set-SolarizedLightColorDefaults.ps1 na mesma pasta do seu perfil do PowerShell (tipicamente C:\Users\<usuário>\Documents\WindowsPowerShell).

Agora, acrescente o código abaixo ao início do seu arquivo de perfil (tipicamente C:\Users\<usuário>\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1):

Function Test-IsAdmin
{
    $identity = [Security.Principal.WindowsIdentity]::GetCurrent()
    $principal = New-Object Security.Principal.WindowsPrincipal $identity
    
    return $principal.IsInRole([Security.Principal.WindowsBuiltinRole]::Administrator)
}

try
{
    if (Test-IsAdmin)
    {
        . (Join-Path $PSScriptRoot "Set-SolarizedLightColorDefaults.ps1")
        $host.UI.RawUI.BackgroundColor = [System.ConsoleColor]::White
    }
    else
    {
        . (Join-Path $PSScriptRoot "Set-SolarizedDarkColorDefaults.ps1")
        $host.UI.RawUI.BackgroundColor = [System.ConsoleColor]::Black
    }
}
finally
{
    Clear-Host
}

3) Atualizar o(s) link(s) do PowerShell

Agora, para o Solarized realmente “funcionar”, você precisa atualizar os links do PowerShell que estão na pasta %APPDATA%\Microsoft\Windows\Start Menu\Programs\Windows PowerShell, de modo que eles usem as cores do Solarized. Baixe os scripts Get-Link.ps1 e Update-Link.ps1, abra um prompt de PowerShell no diretório onde você salvou esses scripts e execute os comandos abaixo:

$links = Get-ChildItem (Join-Path $env:APPDATA 'Microsoft\Windows\Start Menu\Programs\Windows PowerShell') -Filter '*.lnk'

$links | % {.\Update-Link.ps1 -Path $_.FullName -Theme Dark}

Voilà! Prompts de PowerShell atualizados – Dark para os prompts normais, Light para os elevados!

Um abraço,
Igor

(Cross-post de http://www.tshooter.com.br/2017/06/21/solarized-powershell-e-prompt-elevado/)