Domyślnie uruchomienie programu PowerShell z Cmder ustawia kolor pierwszego planu na biały:
Dzisiaj zainstalowałem PowerShell Core i utworzyłem nowe zadanie Cmder dokładnie tak, jak domyślne „PowerShell as Admin task”, ale wskazuje pwsh.exe
zamiast 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:
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-Host
instrukcję na -ForegroundColor White
zamiast 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-Host
instrukcję w spokoju (używając oryginalnego Green
koloru), ale dodam dodatkową Write-Host
instrukcję powyżej bez Foregroundcolor
parametru, kolor pierwszego planu pozostanie biały. To tak, jakby Write-Host
oś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 white
kolorze pierwszego planu:
[ScriptBlock]$CmderPrompt = {
$Host.UI.RawUI.ForegroundColor = "White"
Write-Host $pwd.ProviderPath -NoNewLine -ForegroundColor White
checkGit($pwd.ProviderPath)
}
Wyniki również w white
kolorze pierwszego planu:
[ScriptBlock]$CmderPrompt = {
$Host.UI.RawUI.ForegroundColor = "White"
Write-Host "blah"
Write-Host $pwd.ProviderPath -NoNewLine -ForegroundColor Green
checkGit($pwd.ProviderPath)
}
Wyniki w red
kolorze pierwszego planu:
[ScriptBlock]$CmderPrompt = {
$Host.UI.RawUI.ForegroundColor = "White"
Write-Host "blah" -ForegroundColor Red
Write-Host $pwd.ProviderPath -NoNewLine -ForegroundColor Green
checkGit($pwd.ProviderPath)
}
źródło
Odpowiedzi:
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: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.
źródło