Bagaimana cara mewarnai prompt Powershell?

17

Saya selalu membuat prompt saya untuk menjadi warna ini di linux saya Kemudian saya dapat menemukan input saya di jendela perintah hitam. Tapi bisakah kita membuat warna yang sama di Powershell saya ?

Yode
sumber
Apa font konsol itu?
Dmitry Kudriavtsev
@DmitryKudriavtsev Lihat ini , mungkin itu adalah lagu Sim dalam bahasa Inggris.
Yode
Ini mungkin SimSun?
Dmitry Kudriavtsev
@DmitryKudriavtsev Ya, maaf saya membuat kesalahan.
Yode
bukan salahmu, transliterasi itu sulit
Dmitry Kudriavtsev

Jawaban:

32

tangkapan layar prompt berwarna

PowerShell meminta

Yang ingin Anda lakukan adalah menyesuaikan prompt .

Prompt default di PowerShell 3.0 dan yang lebih baru adalah:

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

Urutan warna melarikan diri

Sekarang, Windows 10 mendukung yang kode melarikan diri ANSI di conhost nya, dan 24-bit warna didukung sejak 1703.

Untuk menggunakan salah satu kode pelarian ANSI, kita memerlukan karakter ESC literal . Ini oktal 033, atau desimal 27. Di Bash, Anda akan menggunakan "\033"atau "\e"; Tidak ada urutan ekuivalen langsung di PowerShell tetapi Anda bisa menanamkan ekspresi:"$([char]27)"

Di PowerShell Core Anda bisa menggunakan "`e"urutan pelarian sebagai gantinya. Berkat komentar dari asherber.


Gunakan di PowerShell

Ini berarti Anda dapat, misalnya, menggunakan urutan pelarian berikut untuk mengatur warna latar belakang ke cyan dengan kode 46:

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

Yang bisa digunakan seperti:

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

Agar lebih mudah dibaca, mari kita tentukan variabel:

$ESC = [char]27

Jadi kita bisa menggunakan:

"$ESC[46m"

Di mana $ESCkarakter ESC literal, [menentukan awal daftar param, dan makhirnya.

Menggunakannya dalam perintah:

echo "$ESC[46mColoured text"

Dan untuk mengembalikan pengaturan warna asli, kami menggunakan kode 0sebagai gantinya:

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

Warna lebih maju

Jika Anda tidak puas dengan palet 16-warna dasar, Anda dapat menggunakan warna 24-bit penuh dengan formulir:

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

Di mana <r>nilai desimal untuk merah dari 0-255, <g>untuk hijau dan <b>untuk biru, misalnya"$ESC[48;2;255;0;123m"

Silakan merujuk ke dokumentasi untuk informasi lebih lanjut.

Sebenarnya, ini semua setara langsung dengan apa yang akan Anda lakukan di bash, kecuali Anda harus menggunakan $ESC(setelah Anda mendefinisikannya) sebagai ganti dari \eatau \033.


Mengatur prompt berwarna

Menyatukan ini, kita dapat menggunakan kode pelepasan warna ANSI dalam prompt yang dimodifikasi untuk mengubah warna latar belakang:

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

Kegigihan

Jika Anda ingin ini tetap ada di seluruh sesi, tambahkan ke profil Anda (seperti .bashrc). Anda dapat melihat jalur ke profil Anda di $profile.

Bob
sumber
Hai ~, ini adalah jawaban yang bagus..Tapi lebih jauh lagi, bisakah kita membuat teks menjadi gaya tebal ? Kemudian kita dapat menemukannya lebih mudah ..
yode
1
@Yode Ini kurang lebih semua didokumentasikan di sini , yang saya tautkan dalam jawabannya;)
Bob
1
@yode Ah. Jika Anda membandingkan 37 putih non-terang, sepertinya PowerShell windows sudah menggunakan 97 putih terang secara default. (btw, akan ada palet warna baru untuk instalasi bersih versi Win10 berikutnya. Ada beberapa tangkapan layar di sana dari palet saat ini ; perhatikan bahwa 1;37mitu sama dengan 97m, keduanya berarti "putih cerah")
Bob
1
@Yode Pada dasarnya, conhost belum mendukung huruf tebal. Bright adalah pengganti huruf tebal, dan Anda sudah menggunakan warna cerah secara default. Jika Anda benar-benar ingin cetak tebal, Anda dapat menggunakan terminal alternatif, seperti ConEmu - tetapi sepertinya dukungan mereka untuk ANSI tebal juga tidak lengkap. IMO, itu tidak sepadan dengan masalahnya.
Bob
1
Saya tidak bisa mendapatkan penurunan harga untuk bekerja dengan benar, tetapi di PowerShell Core Anda dapat menggunakan backtick + e untuk [char]27. Saya tidak yakin apakah ini ditambahkan di versi sebelumnya.
asherber