Cmder + PowerShell Core 的奇怪前景色问题

Cmder + PowerShell Core 的奇怪前景色问题

开箱即用,使用 Cmder 运行 PowerShell 会将前景色设置为白色:

在此处输入图片描述

今天我安装了 PowerShell Core 并创建了一个新的 Cmder 任务,与默认的“PowerShell 作为管理员任务”完全相同,但指向的pwsh.exePowershell.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

正如我在问题评论中提到的,我也遇到了这个问题。我并没有确切地知道为什么会发生这种情况,但我找到了一种解决方法。

OP 也启发了我去探索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 
}

这对我来说很有效,因为我知道光标此时位于行首,所以 `r 不会执行任何操作。虽然不太好,但这是一个有效的快速修复方法。我希望其他人也能这样做。

答案2

我已经提出了一个更简单的解决方法,它将一直有效,直到做出已知的修复为止。

  1. 打开默认的 cmd 会话。
  2. 写入powershell命令。

现在您处于 powershell 中,但具有 cmd 的所有默认颜色。如果您需要打开 2 个拆分选项卡,这应该是一个很棒/简单的解决方案。如果您懒得编写 powershell 命令,只需创建另一个带有命令启动的 cmd 会话即可powershell

相关内容