Jak pokolorować monit Powershell?

17

Zawsze podsuwam monit o bycie tym kolorem w moim systemie Linux. Następnie mogę znaleźć swoje wejście w czarnym oknie poleceń. Ale czy możemy zrobić ten sam kolor w mojej Powershell ?

yode
źródło
Co to jest czcionka konsoli?
Dmitry Kudriavtsev
@DmitryKudriavtsev Look to , być może jest to piosenka Sim w języku angielskim.
yode
Może to SimSun?
Dmitry Kudriavtsev
@DmitryKudriavtsev Tak, przepraszam, że popełniłem błąd.
yode
nie twoja wina, transliteracja jest trudna
Dmitry Kudriavtsev,

Odpowiedzi:

32

zrzut ekranu z kolorowym monitem

Monity PowerShell

To, co chcesz zrobić, to dostosować monit .

Domyślny monit w programie PowerShell 3.0 i nowszym to:

function prompt  
{  
    "PS $($executionContext.SessionState.Path.CurrentLocation)$('>' * ($nestedPromptLevel + 1)) "  
}

Sekwencje zmiany koloru

Teraz, Windows 10 podpory te kody ucieczki ANSI w swojej conhost i 24-bitowa głębia kolorów jest obsługiwany od 1703 roku.

Aby użyć jednego z kodów ucieczkowych ANSI, potrzebujemy dosłownego znaku ESC . Jest to ósemkowa 033 lub dziesiętna 27. W Bash użyłbyś "\033"lub "\e"; W programie PowerShell nie ma bezpośredniej równoważnej sekwencji, ale zamiast tego można osadzić wyrażenie:"$([char]27)"

W PowerShell Core można "`e"zamiast tego użyć sekwencji ucieczki. Dzięki komentarzowi asherbera.


Użyj w PowerShell

Oznacza to, że możesz na przykład użyć następującej sekwencji zmiany znaczenia, aby ustawić kolor tła na niebieskozielony za pomocą kodu 46:

"$([char]27)[46m"

Które można wykorzystać tak:

echo "$([char]27)[46mColoured text"

Aby wszystko było bardziej czytelne, zdefiniujmy zmienną:

$ESC = [char]27

Możemy więc użyć:

"$ESC[46m"

Gdzie $ESCjest dosłowny znak ESC, [określa początek listy parametrów i mkoniec.

Używanie go w poleceniu:

echo "$ESC[46mColoured text"

Aby przywrócić oryginalne ustawienia kolorów, 0zamiast tego używamy kodu :

echo "$ESC[46mColoured text$ESC[0mUncoloured text"

Bardziej zaawansowane kolory

Jeśli nie jesteś zadowolony z podstawowej palety 16 kolorów, możesz użyć pełnych 24-bitowych kolorów za pomocą formularza:

"$ESC[48;2;<r>;<g>;<b>m"

Gdzie <r>jest wartość dziesiętna dla czerwonego z 0-255, <g>dla zielonego i <b>niebieskiego, np"$ESC[48;2;255;0;123m"

Więcej informacji znajduje się w dokumentacji .

W rzeczywistości jest to bezpośrednio równoważne z tym, co zrobiłbyś w bash, z wyjątkiem tego, że musisz użyć $ESC(po zdefiniowaniu) zamiast \elub \033.


Ustawianie kolorowego monitu

Zestawiając je razem, możemy użyć kodów ucieczki kolorów ANSI w zmodyfikowanym monicie, aby zmienić kolor tła:

function prompt  
{  
    $ESC = [char]27
    "$ESC[46mPS $($executionContext.SessionState.Path.CurrentLocation)$('>' * ($nestedPromptLevel + 1)) $ESC[0m"  
}

Trwałość

Jeśli chcesz, aby trwało to między sesjami, dodaj go do swojego profilu (np .bashrc.). Możesz wyświetlić ścieżkę do swojego profilu w $profile.

Kok
źródło
Cześć ~, to świetna odpowiedź .. Ale czy możemy sprawić, by tekst był odważny ? W takim razie łatwiej nam będzie ..
Yode,
1
@yode To mniej więcej wszystko tutaj udokumentowane , do którego link podałem w odpowiedzi;)
Bob
1
@yode Ah. Jeśli porównasz do 37 nie-jasnych bieli, wygląda na to, że okna programu PowerShell domyślnie używają 97 jasnych bieli. (przy okazji, pojawi się nowa paleta kolorów dla czystych instalacji kolejnej wersji Win10. Są tam zrzuty ekranu z obecnej palety ; zwróć uwagę, że 1;37mjest to to samo 97m, co oznacza „jasna biel”)
Bob
1
@yode Zasadniczo conhost nie obsługuje jeszcze pogrubienia. Jasne zastępuje pogrubienie, a już domyślnie używasz jasnego koloru. Jeśli naprawdę chcesz pogrubić, możesz użyć alternatywnego terminala, takiego jak ConEmu - ale wygląda na to, że ich obsługa pogrubionego ANSI również nie jest kompletna. IMO, to nie jest warte kłopotów.
Bob
1
Nie mogę sprawić, aby Markdown działał poprawnie, ale w PowerShell Core możesz użyć backsticka + e dla [char]27. Nie jestem pewien, czy zostało to dodane we wcześniejszych wersjach.
asherber