Solarized, PowerShell e prompt elevado

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

Autor: Igor Abade

Igor Abade V. Leite ([email protected]) é Microsoft MVP (Most Valuable Professional) de Visual Studio ALM desde 2006. Palestrante em diversos eventos da comunidade de desenvolvimento de software (TechEd Brasil, The Developers’ Conference, DevOps Summit Brasil, Agile Brazil, Visual Studio Summit, QCON e outros), é também autor de artigos em revistas e sites como o MSDN Brasil. Desde março de 2011 é um dos sócios da Lambda3, uma consultoria especializada em ALM, desenvolvimento de software e treinamentos. Visite seu blog sobre VS ALM em http://www.tshooter.com.br/ e siga-o no Twitter @igorabade.

Deixe seu comentário!