Dziwny problem z kolorem pierwszego planu w Cmder + PowerShell Core


3

Domyślnie uruchomienie programu PowerShell z Cmder ustawia kolor pierwszego planu na biały:

wprowadź opis zdjęcia tutaj

Dzisiaj zainstalowałem PowerShell Core i utworzyłem nowe zadanie Cmder dokładnie tak, jak domyślne „PowerShell as Admin task”, ale wskazuje pwsh.exezamiast Powershell.exe:

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

Z powodów, których nie rozumiem, kolor pierwszego planu dla okna PowerShell Core jest zielony:

wprowadź opis zdjęcia tutaj

Próbując zrozumieć, dlaczego, spędziłem trochę czasu na majstrowaniu przy następującym bloku kodu zawartym w \vendor\profile.ps1:

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

Tutaj zaczyna się dziwnie. Jeśli zmienię tę Write-Hostinstrukcję na -ForegroundColor Whitezamiast Green, kolor pierwszego planu pozostanie trwale biały. Jeśli zmienię to Red, kolor pierwszego planu pozostanie trwale czerwony. Jeszcze dziwniejsze: jeśli pozostawię oryginalną Write-Hostinstrukcję w spokoju (używając oryginalnego Greenkoloru), ale dodam dodatkową Write-Hostinstrukcję powyżej bez Foregroundcolorparametru, kolor pierwszego planu pozostanie biały. To tak, jakby Write-Hostoświadczenie było wymagane w celu utrzymania stanu $Host.UI.RawUI.ForegroundColor.

Czy ktoś jeszcze doświadcza tej osobliwości? Czy brakuje mi czegoś głupiego?

Próbowałem tego z Cmder 1.3.5 i 1.3.6 - ten sam wynik.


Dodatkowe przykłady:

Wyniki w whitekolorze pierwszego planu:

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

Wyniki również w whitekolorze pierwszego planu:

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

Wyniki w redkolorze pierwszego planu:

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


1
Zgłoś to autorom cmder
Maximus

Mam również ten problem. Używam przenośnej wersji cmder na dwóch różnych komputerach. Na obu używam pwsh 6.1.0, ale co dziwne, tylko jeden z nich ma problem z kolorem pierwszego planu.
Manuzor

Zauważ, że otworzyłem problem na ten temat w repozytorium github Cmdera.
Nick Spreitzer

Jest to dla mnie problem od aktualizacji Windows 10 v1809. Wpływa na dwie oddzielne maszyny.
root

Tak, właśnie zaktualizowałem system do najnowszej wersji Windows 10 i teraz jest to problem zarówno z PS Core, jak i PS 5.
Nick Spreitzer

Odpowiedzi:


2

Jak wspomniano w moim komentarzu do pytania, ten problem również występuje. Nie do końca dowiedziałem się, dlaczego tak się dzieje, ale znalazłem obejście.

OP zainspirowało mnie również do zabawy Write-Host, więc wymyśliłem to:

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

Działa to dla mnie, ponieważ wiem, że kursor znajduje się na początku linii w tym punkcie, więc nic nie rób. Nie ładna, ale działa szybko. Mam nadzieję, że dotyczy to również innych.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.