Saltar al contenido

Salida de texto en color en la consola de PowerShell usando códigos ANSI / VT100

Te damos la bienvenida a proyecto on line, aquí vas a hallar la resolución de lo que buscas.

Solución:

Tiempo Las ventanas de la consola en Windows 10 admiten secuencias de escape VT (Terminal virtual) / ANSIen principio, el apoyo está girado APAGADO por defecto.

Tienes tres opciones:

  • (a) Activar soporte globalmente por defecto, persistentemente, a través del registro, como se detalla en esta respuesta SU.

    • En resumen: en el registro key [HKEY_CURRENT_USERConsole], cree o establezca el VirtualTerminalLevel Valor DWORD a 1
      • Desde PowerShell, puede hacer esto programáticamente como sigue:
        Set-ItemProperty HKCU:Console VirtualTerminalLevel -Type DWORD 1
      • De cmd.exe (también funciona desde PowerShell):
        reg add HKCUConsole /v VirtualTerminalLevel /t REG_DWORD /d 1
    • Abra una nueva ventana de la consola para que los cambios surtan efecto.
    • Vea las advertencias a continuación.
  • (B) Activar soporte desde el interior de su programa, solo para ese programa (proceso), con una llamada al SetConsoleMode() Función API de Windows.

    • Vea los detalles abajo.
  • (C) Solución alternativa ad-hoc, de PowerShell: canalizar salida de programas externos a Out-Host; p.ej, .test.exe | Out-Host

    • Vea los detalles abajo.

Re (a):

El enfoque basado en el registro activa invariablemente el soporte VT globalmente, es decir, para todos ventanas de la consola, independientemente de qué shell / programa se ejecute en ellos:

  • Los ejecutables / shells individuales aún pueden desactivar el soporte por sí mismos, si lo desea, usando el método (b).

  • Sin embargo, a la inversa, esto significa que la salida de cualquier programa que no controle explícitamente el soporte de VT estará sujeta a la interpretación de las secuencias de VT; Si bien esto es generalmente deseable, hipotéticamente esto podría conducir a una mala interpretación de los resultados de los programas que accidentalmente producir resultados con secuencias similares a VT.

Nota:

  • Mientras que hay es un mecanismo que permite que la configuración de la ventana de la consola sea delimitada por el ejecutable de inicio / título de la ventana, a través de subclaves de [HKEY_CURRENT_USRConsole], los VirtualTerminalLevel el valor parece no estar respaldado allí.

  • Incluso si lo fuera, sin embargo, no sería un robusto solución, porque abrir una ventana de consola a través de un atajo expediente (*.lnk) (por ejemplo, desde el menú Inicio o la barra de tareas) no respetaría estas configuraciones, porque *.lnk los archivos tienen configuraciones construir en ellos; mientras que puede modificar estas configuraciones integradas a través del Properties Cuadro de diálogo GUI, en el momento de escribir este VirtualTerminalLevel la configuración no aparece en esa GUI.


Re (b):

Llamando al SetConsoleMode() Función API de Windows desde dentro del programa (proceso), como se describe aquí, es engorroso incluso en C # (debido a que requiere una declaración P / Invoke), y puede que no sea una opción:

  • para programas escritos en lenguajes desde los que no se admite la llamada a la API de Windows.

  • si tiene un ejecutable preexistente que no puede modificar.

Si no desea habilitar el soporte globalmente en ese caso (opción (a)), la opción (c) (de PowerShell) puede funcionar para usted.


Re (c):

PowerShell activa automáticamente la compatibilidad con VT (terminal virtual) por sí mismo cuando se inicia (en las versiones recientes de Windows 10, esto se aplica tanto a Windows PowerShell como a PowerShell Core).

Por lo tanto, si tu relé la salida de un programa externo a través de PowerShell, secuencias VT están Reconocido; utilizando Out-Host es la forma más sencilla de hacer eso (Write-Host también funcionaría):

.t.exe | Out-Host

Nota: Utilice Out-Host solo si quiere imprimir en el consola; si, por el contrario, quieres capturar la salida del programa externo, use solo $capturedOutput = .test.exe

Advertencia sobre la codificación de caracteres: Windows PowerShell de forma predeterminada espera que la salida de programas externos use la página de códigos OEM, según lo definido por la configuración regional del sistema heredado (por ejemplo, 437 en los sistemas en inglés de EE. UU.) y como se refleja en [console]::OutputEncoding. Los programas de consola .NET respetan esa configuración automáticamente, pero para los programas que no son .NET (por ejemplo, scripts Python) que usan una codificación diferente (y producen no solo una salida ASCII pura (en el rango de 7 bits)), debe (al menos temporalmente) especifique esa codificación asignando a [console]::OutputEncoding; por ejemplo, para UTF-8:
[console]::OutputEncoding = [Text.Encoding]::Utf8.
Tenga en cuenta que esto no solo es necesario para la solución alternativa de secuencias VT, sino que generalmente es necesario para que PowerShell represente correctamente los caracteres que no son ASCII.

Potencia Shell Centro, desafortunadamente, a partir de v6.1.0-preview.4, todavía se establece de forma predeterminada en la página de códigos OEM, pero eso debería considerarse un insecto, dado que PowerShell Core por defecto es UTF-8 sin BOM.

Gracias al usuario mklement0 por informarme de que el soporte VT no está habilitado automáticamente. Esto me hizo mirar en la dirección correcta y encontré esta publicación útil.

Entonces, para responder a mi pregunta: agregue o configure el registro key

HKCU:Console  -  [DWORD] VirtualTerminalLevel = 1

Reinicia la consola y funciona.

Comentarios y puntuaciones

Recuerda algo, que tienes la capacidad de decir si te fue preciso.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *