2

Из коробки при запуске PowerShell с Cmder цвет переднего плана становится белым:

Сегодня я установил PowerShell Core и создал новую задачу Cmder точно так же, как по умолчанию «PowerShell as Admin task», но указывает на pwsh.exe вместо Powershell.exe:

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

По причинам, которые я не понимаю, основной цвет для окна PowerShell Core - зеленый:

Пытаясь понять, почему, я потратил некоторое время, возясь со следующим блоком кода, который находится в \vendor\profile.ps1:

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

Вот где это становится странным. Если я изменю этот оператор Write-Host на использование -ForegroundColor White вместо Green , цвет переднего плана останется постоянно белым. Если я изменю его на Red , цвет переднего плана останется красным. Еще более странно: если я оставлю оригинальную инструкцию Write-Host одиночку (используя оригинальный Green цвет), но добавлю над ней дополнительную инструкцию Write-Host без параметра Foregroundcolor , цвет переднего плана останется белым. Это как если бы оператор Write-Host требовался для поддержания состояния $Host.UI.RawUI.ForegroundColor .

Кто-нибудь еще испытывает эту странность? Я что-то упустил глупо?

Я пробовал это с Cmder 1.3.5 и 1.3.6 - тот же результат.


Дополнительные примеры:

Результаты в white цвете переднего плана:

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

Также приводит к white цвету переднего плана:

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

Результаты в red цвете переднего плана:

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

1 ответ1

1

Как упоминалось в моем комментарии к вопросу, я также испытываю эту проблему. Я точно не выяснил, почему это происходит, но я нашел обходной путь.

ОП вдохновил меня и на Write-Host , так что я придумал это:

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

Это работает для меня, потому что я знаю, что курсор находится в начале строки в этой точке, поэтому вы ничего не делаете. Не красиво, но это быстрое решение, которое работает. Я надеюсь, что это также для других.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .