web-dev-qa-db-ja.com

Cmder + PowerShellCoreでの奇妙な前景色の問題

箱から出して、CmderでPowerShellを実行すると、前景色が白に設定されます。

enter image description here

今日、PowerShell Coreをインストールし、デフォルトの「管理者タスクとしてのPowerShell」とまったく同じように新しいCmderタスクを作成しましたが、_pwsh.exe_ではなく_Powershell.exe_を指しています。

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

わかりませんが、PowerShellCoreウィンドウの前景色は緑です。

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_ステートメントをGreenの代わりに_-ForegroundColor White_を使用するように変更すると、前景色は永続的に白のままになります。 Redに変更すると、前景色は永続的に赤のままになります。さらに奇妙なことに、元の_Write-Host_ステートメントをそのままにして(元のGreen色を使用)、その上にForegroundcolorパラメーターなしで_Write-Host_ステートメントを追加すると、前景色は白のままです。 _Write-Host_の状態を維持するには、_$Host.UI.RawUI.ForegroundColor_ステートメントが必要であるかのようです。

この奇妙なことを経験している人は他にいますか?私は愚かな何かを逃していますか?

私はこれをCmder1.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) }

3
Nick Spreitzer

質問へのコメントで述べたように、私もこの問題を経験しています。なぜこれが起こっているのか正確にはわかりませんでしたが、回避策を見つけました。

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
Manuzor

既知の修正が行われるまで機能する、より簡単な回避策を作成しました。

  1. デフォルトのcmdセッションを開きます。
  2. powershellコマンドを記述します。

これでPowerShellを使用できますが、cmdのデフォルトの色がすべて使用されています。 2つの分割タブを開く必要がある場合は、優れた/簡単なソリューションになるはずです。 PowerShellコマンドを書くのが面倒な場合は、powershellコマンドを使用して起動する別のcmdセッションを作成するだけです。

0
Arto Kalishian