Ungewöhnliches Vordergrundfarbenproblem mit Cmder + PowerShell Core

456
Nick Spreitzer

Wenn Sie PowerShell mit Cmder ausführen, wird die Vordergrundfarbe standardmäßig auf Weiß gesetzt:

enter image description here

Heute habe ich installiert Powershell - Core und eine neue Cmder Aufgabe genau wie der Standard ‚Powershell als Admin Aufgabe‘, aber Punkte pwsh.exestatt Powershell.exe:

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

Aus Gründen, die ich nicht verstehe, ist die Vordergrundfarbe für das PowerShell Core-Fenster grün:

enter image description here

Während ich versuchte zu verstehen, warum, verbrachte ich einige Zeit mit dem folgenden Codeblock, der in \vendor\profile.ps1:

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

Hier wird es komisch. Wenn ich diese Write-HostAnweisung zur Verwendung -ForegroundColor Whiteanstelle von ändere, Greenbleibt die Vordergrundfarbe dauerhaft weiß. Wenn ich es auf ändere Red, bleibt die Vordergrundfarbe dauerhaft rot. Noch seltsamer: Wenn ich die ursprüngliche Write-HostAussage alleine lasse (mit der ursprünglichen GreenFarbe), aber darüber eine zusätzliche Write-HostAnweisung ohne ForegroundcolorParameter hinzufüge, bleibt die Vordergrundfarbe weiß. Es ist, als ob eine Write-HostAussage erforderlich ist, um den Status von aufrechtzuerhalten $Host.UI.RawUI.ForegroundColor.

Wer sonst noch diese Seltsamkeit erlebt? Fehlt mir etwas Dummes?

Ich habe dies mit Cmder 1.3.5 und 1.3.6 versucht - gleiches Ergebnis.


Zusätzliche Beispiele:

Ergebnisse in whiteVordergrundfarbe:

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

Ergebnisse auch in whiteVordergrundfarbe:

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

Ergebnisse in redVordergrundfarbe:

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

2
Melden Sie dies den Autoren von cmder Maximus vor 6 Jahren 1
Ich erlebe auch dieses Problem. Ich verwende eine portable Version von cmder auf zwei verschiedenen Computern. Bei beiden nutze ich pwsh 6.1.0, aber seltsamerweise hat nur einer von ihnen dieses Problem mit der Vordergrundfarbe. Manuzor vor 6 Jahren 0
Beachten Sie, dass ich [https://github.com/cmderdev/cmder/issues/1899] über das Cmder-Github-Repo [eine Ausgabe zu diesem Thema] erstellt habe. Nick Spreitzer vor 6 Jahren 0
Dies ist ein Problem für mich seit dem Update von Windows 10 v1809. Zwei getrennte Maschinen bedienen. root vor 6 Jahren 0
Ja, ich * habe * gerade * auf das neueste Windows 10 aktualisiert und jetzt ist dies ein Problem sowohl mit PS Core als auch mit PS 5. Nick Spreitzer vor 6 Jahren 0

1 Antwort auf die Frage

1
Manuzor

Wie in meinem Kommentar zu der Frage erwähnt, erlebe ich auch dieses Problem. Ich habe nicht genau herausgefunden, warum dies geschieht, aber ich habe eine Problemumgehung gefunden.

Das OP hat mich dazu inspiriert, auch mit mir herumzumachen Write-Host, also habe ich mir folgendes ausgedacht :

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

Dies funktioniert für mich, weil ich weiß, dass sich der Cursor an diesem Punkt am Anfang einer Zeile befindet, also nichts tun. Nicht schön, aber es ist eine schnelle Lösung, die funktioniert. Ich hoffe, dass es auch für andere gilt.