¿Cómo colorear el indicador de Powershell?

17

Siempre hago que mi mensaje sea de este color en mi linux. Luego puedo encontrar mi entrada en la ventana de comandos negra. ¿Pero podemos hacer el mismo color en mi Powershell ?

yode
fuente
¿Cuál es la fuente de la consola?
Dmitry Kudriavtsev
@DmitryKudriavtsev Mira esto , tal vez es la canción de Sim en inglés.
yode
Este es SimSun tal vez?
Dmitry Kudriavtsev
@DmitryKudriavtsev Sí, lo siento, me equivoco.
yode
no es tu culpa, la transliteración es difícil
Dmitry Kudriavtsev

Respuestas:

32

captura de pantalla de aviso de color

Indicaciones de PowerShell

Lo que desea hacer es personalizar la solicitud .

El indicador predeterminado en PowerShell 3.0 y versiones posteriores es:

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

Secuencias de escape de color

Ahora, Windows 10 admite los códigos de escape ANSI en su host, y el color de 24 bits es compatible desde 1703.

Para usar uno de los códigos de escape ANSI, necesitamos un carácter ESC literal . Esto es octal 033, o decimal 27. En Bash, usaría "\033"o "\e"; No hay una secuencia equivalente directa en PowerShell, pero puede insertar una expresión:"$([char]27)"

En PowerShell Core puede usar la "`e"secuencia de escape en su lugar. Gracias al comentario de asherber.


Usar en PowerShell

Esto significa que puede, por ejemplo, usar la siguiente secuencia de escape para establecer el color de fondo en cian con el código 46:

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

Que se puede usar así:

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

Para hacer las cosas más legibles, definamos una variable:

$ESC = [char]27

Entonces podemos usar:

"$ESC[46m"

Donde $ESCestá el carácter ESC literal, [define el inicio de la lista de parámetros y mel final.

Usándolo en un comando:

echo "$ESC[46mColoured text"

Y para restaurar la configuración de color original, usamos el código en su 0lugar:

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

Colores más avanzados

Si no está satisfecho con la paleta básica de 16 colores, puede usar colores completos de 24 bits con el formulario:

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

¿Dónde <r>está el valor decimal para rojo de 0-255, <g>para verde y <b>para azul, por ejemplo?"$ESC[48;2;255;0;123m"

Consulte la documentación para obtener más información.

De hecho, todo esto es directamente equivalente a lo que harías en bash, excepto que debes usar $ESC(después de haberlo definido) en lugar de \eo \033.


Establecer una solicitud de color

En conjunto, podemos usar los códigos de escape de color ANSI en una solicitud modificada para cambiar el color de fondo:

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

Persistencia

Si desea que esto persista en las sesiones, agréguelo a su perfil (como .bashrc). Puede ver la ruta a su perfil en $profile.

Beto
fuente
Hola ~, es una gran respuesta ... Pero aún más, ¿podríamos hacer que el texto tenga un estilo audaz ? Entonces podemos encontrarlo más fácil ...
yode
1
@yode Está más o menos todo documentado aquí , que vinculé en la respuesta;)
Bob
1
@yode Ah. Si compara con 37 blancos no brillantes, parece que las ventanas de PowerShell ya usan 97 blancos brillantes de forma predeterminada. (por cierto, habrá una nueva paleta de colores para instalaciones limpias de la próxima versión de Win10. Hay algunas capturas de pantalla de la paleta actual ; tenga en cuenta que 1;37mes lo mismo 97m, ambos significan "blanco brillante")
Bob
1
@yode Básicamente, conhost aún no admite negrita. El brillo es un sustituto del negrita, y ya está usando el color brillante de forma predeterminada. Si realmente quiere negrita, puede usar un terminal alternativo, como ConEmu , pero parece que su compatibilidad con ANSI negrita tampoco está completa. OMI, no vale la pena.
Bob
1
No puedo hacer que Markdown funcione correctamente, pero en PowerShell Core puedes usar backtick + e para [char]27. No estoy seguro de si esto se agregó en versiones anteriores.
asherber