Problema estranho de cor de primeiro plano com o Cmder + PowerShell Core

2

Fora da caixa, a execução do PowerShell com o Cmder define a cor do primeiro plano como branco:

HojeinstaleioPowerShellCoreecrieiumanovatarefadoCmderexatamentecomoatarefapadrão"PowerShell as Admin", mas aponta para pwsh.exe em vez de Powershell.exe :

*C:\Program Files\PowerShell\pwsh.exe -ExecutionPolicy Bypass -NoLogo -NoProfile -NoExit -Command "Invoke-Expression '. ''%ConEmuDir%\..\profile.ps1'''"

Por motivos que não entendo, a cor do primeiro plano da janela do PowerShell Core é verde:

Enquantotentavaentenderomotivo,passeialgumtempomexendonoseguinteblocodecódigocontidoem \vendor\profile.ps1 :

[ScriptBlock]$CmderPrompt = { $Host.UI.RawUI.ForegroundColor = "White" Write-Host $pwd.ProviderPath -NoNewLine -ForegroundColor Green checkGit($pwd.ProviderPath) }

Aqui é onde fica esquisito. Se eu alterar essa instrução Write-Host para usar -ForegroundColor White em vez de Green , a cor de primeiro plano permanecerá permanentemente branca. Se eu alterá-lo para Red , a cor do primeiro plano ficará permanentemente vermelha. Ainda mais estranho: se eu deixar a instrução Write-Host original sozinha (usando o original Green color), mas adicionar uma instrução Write-Host adicional acima sem o parâmetro Foregroundcolor , a cor do primeiro plano permanecerá branca. É como se uma instrução Write-Host fosse necessária para manter o estado de $Host.UI.RawUI.ForegroundColor .

Alguém mais experimentando essa esquisitice? Estou faltando algo estúpido?

Eu tentei isso com o Cmder 1.3.5 e 1.3.6 - mesmo resultado.

Exemplos adicionais:

Resultados em white cor de primeiro plano:

[ScriptBlock]$CmderPrompt = { $Host.UI.RawUI.ForegroundColor = "White" Write-Host $pwd.ProviderPath -NoNewLine -ForegroundColor White checkGit($pwd.ProviderPath) }

Também resulta em white cor de primeiro plano:

[ScriptBlock]$CmderPrompt = { $Host.UI.RawUI.ForegroundColor = "White" Write-Host "blah" Write-Host $pwd.ProviderPath -NoNewLine -ForegroundColor Green checkGit($pwd.ProviderPath) }

Resultados em red cor de primeiro plano:

[ScriptBlock]$CmderPrompt = { $Host.UI.RawUI.ForegroundColor = "White" Write-Host "blah" -ForegroundColor Red Write-Host $pwd.ProviderPath -NoNewLine -ForegroundColor Green checkGit($pwd.ProviderPath) }

    
por Nick Spreitzer 24.09.2018 / 04:44

1 resposta

1

Como mencionado no meu comentário à pergunta, também estou com esse problema. Eu não descobri exatamente porque isso está acontecendo, mas encontrei uma solução alternativa.

O OP também me inspirou a pesquisar com Write-Host , então eu criei isto:

# File "$env:CMDER_ROOT\config\user-profile.ps1"
# I copy-pasted this from "$env:CMDER_ROOT\vendor\profile.ps1" and added the 'b line.
[ScriptBlock]$CmderPrompt = {
    $Host.UI.RawUI.ForegroundColor = "White"

    # Workaround to make above line apply the "White" foreground color.
    # Seems like you have to print _something_ before using Write-Host with -ForegroundColor.
    # Note: Empty string "" doesn't work.
    Write-Host "'r" -NoNewline

    Microsoft.PowerShell.Utility\Write-Host $pwd.ProviderPath -NoNewLine -ForegroundColor Green
    Microsoft.PowerShell.Utility\Write-Host (checkGit($pwd.ProviderPath)) -NoNewLine 
}

Isso funciona para mim porque eu sei que o cursor está no começo de uma linha naquele ponto, então não faço nada. Não é bonito, mas é uma solução rápida que funciona. Espero que seja para os outros também.

    
por 02.10.2018 / 08:14