Странная проблема цвета переднего плана с Cmder + PowerShell Core

352
Nick Spreitzer

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

enter image description here

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

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

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

enter image description here

Пытаясь понять, почему, я потратил некоторое время, возясь со следующим блоком кода, содержащимся в \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) }

2
Сообщить об этом авторам cmder Maximus 5 лет назад 1
Я также испытываю эту проблему. Я использую портативную версию cmder на двух разных компьютерах. На обоих из них я использую pwsh 6.1.0, но, как ни странно, только у одного из них есть проблема с цветом переднего плана. Manuzor 5 лет назад 0
Обратите внимание, что я [открыл вопрос об этом] (https://github.com/cmderdev/cmder/issues/1899) в репозитории Cmder github. Nick Spreitzer 5 лет назад 0
Это проблема для меня с обновлением Windows 10 v1809. Влияние двух отдельных машин. root 5 лет назад 0
Да, я * только * обновился до последней Windows 10, и теперь это проблема как с PS Core, так и с PS 5. Nick Spreitzer 5 лет назад 0

1 ответ на вопрос

1
Manuzor

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

ОП вдохновил меня на то, чтобы возиться 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  } 

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