开箱即用,使用 Cmder 运行 PowerShell 会将前景色设置为白色:
今天我安装了 PowerShell Core 并创建了一个新的 Cmder 任务,与默认的“PowerShell 作为管理员任务”完全相同,但指向的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
正如我在问题评论中提到的,我也遇到了这个问题。我并没有确切地知道为什么会发生这种情况,但我找到了一种解决方法。
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
我已经提出了一个更简单的解决方法,它将一直有效,直到做出已知的修复为止。
- 打开默认的 cmd 会话。
- 写入
powershell
命令。
现在您处于 powershell 中,但具有 cmd 的所有默认颜色。如果您需要打开 2 个拆分选项卡,这应该是一个很棒/简单的解决方案。如果您懒得编写 powershell 命令,只需创建另一个带有命令启动的 cmd 会话即可powershell
。