Host de consola alternativo para Windows 7/Windows Server 2008

Host de consola alternativo para Windows 7/Windows Server 2008

A menudo me siento frustrado con la aplicación host de la consola de Windows, especialmente por lo torpe que funciona el portapapeles, los problemas de ancho no automático, etc. Me gustaría saber si hay una manera de reemplazar el host de la consola predeterminado conhost.exepor uno personalizado y dónde podría Encuentro más información sobre las interfaces que tendría que implementar si escribiera la mía propia.

No busco sólo una consola alternativa, ya uso xtermCygWin. Estoy buscando información sobre cómoreemplazarHost de ventana de consola predeterminado de Windows.

Respuesta1

A continuación se muestran algunos buenos productos de reemplazo de consolas que son más fáciles de usar que cmd.

Como se comenta a continuación, desde Windows 7, todos estos shells son solo una interfaz para conhost.exe, incluso powershell. Para más detalles, lea¿Qué es conhost.exe y por qué se ejecuta?.

Por lo tanto, las consolas a continuación solo reemplazan la interfaz visual predeterminada para conhost, que es la que muestra cmd, y solo son útiles cuando se invocan directamente como programas. No se pueden invocar indirectamente, como cuando se ejecuta un ejecutable de consola como diskpart, ya que esto invocará a conhost, y conhost tiene su propia interfaz de E/S y API.

Esto es lo que dice Microsoft enWindows 7/Windows Server 2008 R2: host de consola:

ConHost representa un cambio permanente en la forma en que se maneja la E/S de la aplicación de consola. No existe ninguna clave de registro ni configuración de política de grupo que pueda obligar a Windows a volver al comportamiento de la consola en "modo heredado".

La conclusión es que si desea reemplazar la consola de una manera más profunda que reemplazar la interfaz cmd, entonces esto no es posible. Microsoft ha elegido este diseño como medida de seguridad y no volverá atrás.

La única forma en que puedo pensar en cambiar la forma en que se comporta conhost es establecer un enlace de sistema global en la API de conhost. No sé en absoluto si esto es posible y nadie lo ha hecho hasta ahora (o si lo hicieron no lo dicen). Tampoco creo que Microsoft le permita reemplazar un archivo de sistema tan importante como conhost.exe por una versión pirateada.

Si es necesario reemplazar cmd, que reside en system32\cmd.exe, es necesario tomar posesión del archivo y luego cambiarle el nombre (¿cmd1.exe?), cambiar el nombre del exe de reemplazo de la consola a cmd.exe y copiarlo a system32 junto con todos los archivos que necesita para que funcione. Esto podría causar problemas si la consola de reemplazo no admite todos los parámetros que admite cmd.

Otro enfoque que funciona para archivos .bat es asociar la nueva consola con ellos. Para esto es necesario editar la clave de registro HKEY_CLASSES_ROOT\batfile\shell\open\command. Mira estoartículopara algunos detalles.

Aquí está la lista de consolas:

Consola de colores
fuegocmd
PowerCmd
GS.EXE
PyCmd

Respuesta2

Hay programas comoConsolaque envuelve cmd.exe y probablemente pueda brindarle lo que está buscando, pero no he visto nada que reemplace completamente el sistema de la consola. AFAIK, la mayoría de este tipo de proyectos simplemente redirigen stdin/stdout/stderr y luego envuelven una GUI más común alrededor de cmd.exe, ocultando la ventana de la consola real en segundo plano.

Respuesta3

Microsoft ha publicado su código fuente conhost.exe (https://github.com/microsoft/terminal).

El código de host de la consola en este repositorio es la fuente real a partir de la cual se construye conhost.exe en Windows.

Así que ahora tienes la oportunidad de reemplazar el conhost.exe predeterminado con tu propio host de consola en Windows 10. De hecho, ya hice ese intento y logré el éxito (https://github.com/microsoft/terminal/issues/1817).

Luego Microsoft dijo que el código fuente de OpenConsole proviene de conhost.exe, entonces, ¿podemos reemplazar conhost.exe directamente con OpenConsole.exe? De esta manera obtenemos un mejor host de consola predeterminado.

Lo probé y funciona bien. Aunque OpenConsole está empaquetado como una aplicación para UWP, OpenConsole.exe es en realidad un programa de ventana normal de Win32 que se puede ejecutar haciendo doble clic en su archivo ejecutable. Puede encontrarlo en terminal\bin\x64\Release\OpenConsole.exe si realizó una compilación de lanzamiento x64.

Luego, vaya a C:\Windows\System32, haga clic derecho en conhost.exe, "Propiedades" y edite la lista de permisos para otorgarle al usuario actual el permiso de "Control total".

Luego, cambie el nombre de conhost.exe a conhost-old.exe y copie OpenConsole.exe aquí y cámbiele el nombre a conhost.exe.

Abre cualquier aplicación de consola (powershell, wsl,...) y disfruta de tu nueva consola.

También es posible portar el código fuente de OpenConsole a Windows 7. Además, como tiene el código fuente, puede agregar las funciones que desee.

Además, Microsoft también introdujo la API de pseudoconsola de Windows en Windows 10, lo que permite a los desarrolladores desarrollar aplicaciones de terminal de terceros de manera más elegante (sí, se implementa a través de conhost.exe y debe incluirse en el código publicado por Microsoft).

https://devblogs.microsoft.com/commandline/windows-command-line-introduciendo-the-windows-pseudo-console-conpty/

Estas son las cosas de las que conhost.exe es realmente responsable:

(Dehttps://devblogs.microsoft.com/commandline/windows-command-line-inside-the-windows-console/)

Los componentes principales de la consola constan de lo siguiente (de abajo hacia arriba):

  • ConDrv.sys: controlador en modo kernel

    • Proporciona un canal de comunicaciones de alto rendimiento entre la consola y cualquier aplicación de línea de comandos conectada
    • Transmite mensajes de IO Control (IOCTL) de ida y vuelta entre las aplicaciones de línea de comandos y la consola a la que están "conectadas"
    • Los mensajes IOCTL de la consola contienen
      • Datos que representan solicitudes para ejecutar llamadas API en la instancia de la consola
      • Texto enviado desde la consola a la aplicación de línea de comandos
  • ConHost.exe – Aplicación GUI Win32:

    • ConHost Core: el interior y la plomería de la consola

      • Servidor API: convierte mensajes IOCTL recibidos desde aplicaciones de línea de comandos en llamadas API y envía registros de texto desde la consola a la aplicación de línea de comandos
      • API: implementa la API de la consola Win32 y la lógica detrás de todas las operaciones que se le puede pedir a la consola que realice.
      • Búfer de entrada: almacena registros de eventos de teclado y mouse generados por la entrada del usuario.
      • Analizador VT: si está habilitado, analiza secuencias VT a partir de texto, extrae las encontradas del texto y, en su lugar, genera llamadas API equivalentes.
      • Búfer de salida: almacena el texto que se muestra en la pantalla de la consola. Esencialmente, una matriz 2D de estructuras CHAR_INFO que contienen los datos y atributos de caracteres de cada celda (más información sobre el búfer a continuación)
      • Otros: No se incluyen en el diagrama anterior la infraestructura de configuración que almacena/recupera valores del registro y/o archivos de acceso directo, etc.
    • Servicios de aplicaciones de UX de consola: la capa de UX y UI de consola

      • Gestiona el diseño, tamaño, posición, etc. de la ventana de la Consola en pantalla
      • Muestra y maneja la configuración de la interfaz de usuario, etc.
      • Bombea la cola de mensajes de Windows, maneja los mensajes de Windows y traduce la entrada del usuario en registros de eventos de tecla y mouse, almacenándolos en el búfer de entrada.

Respuesta4

Recomendaría instalar cualquiera de los dosPotencia Shell, que es la versión de Microsoft de un terminal Unix destinado a secuencias de comandos, tuberías, etc. o elServicios de Microsoft para Unix(una vez conocido como SFU), que en realidad es un subsistema Posix completo para Windows, que opera directamente sobre el kernel (es decir, junto con WIN32 y la API de Windows, no encima de él, nuevamente, es decir, no está emulado, es básicamente Unix) y le permitirá utilizar cualquiera (bueno, la mayoría) de las tecnologías y shells *nix. Es una verdadera lástima que los Servicios para Unix no hayan ganado más terreno.

información relacionada