¿Cómo puedo abrir una aplicación de consola con un tamaño de ventana determinado?

16

La aplicación que quiero iniciar es MongoDB. Si lo iniciara normalmente, se ve así:

ingrese la descripción de la imagen aquí

No me gusta la cantidad de saltos de línea y tengo mucho espacio en la pantalla, por lo que me gustaría utilizar dicho espacio para deshacerme de los saltos de línea.

Puedo cambiar el tamaño de la ventana de la consola MODE, así que escribí un archivo por lotes como este:

@ECHO OFF
MODE con:cols=140 lines=70
%~dp0mongodb\bin\mongod --dbpath %~dp0data --rest

Hasta aquí todo bien. Cuando inicio este archivo por lotes, obtengo una ventana más grande, según lo deseado.

Pero cuando presiono Ctrl+ Cpara salir de MongoDB, aparece el molesto mensaje:

Terminate batch job (Y/N)?

Lo cual es inútil, porque el comando del que acabo de salir fue el último comando en el trabajo por lotes de todos modos y no importa lo que responda, el resultado es el mismo.

Entonces, ¿cómo puedo obtener una ventana de consola más grande para la aplicación sin tener ese aviso cuando presiono Ctrl+ C?

Der Hochstapler
fuente

Respuestas:

12

Pasé unas horas hoy para implementar una pequeña aplicación C # que puede envolver otra aplicación de consola y ajustar el tamaño de la ventana del host de la consola.

console-wrapperEs fácil de usar. Solo espera un par de parámetros de línea de comando:

Usage: console-wrapper.exe [OPTIONS]

Options:

      --subject=VALUE        The application that should be started by the
                               console wrapper.
      --width=VALUE          The desired width of the console window.
      --height=VALUE         The desired height of the console window.
  -h, -?, --help             Shows this help message

--widthy --heightse usan para establecer el tamaño de la ventana de consola resultante. --subjectse puede usar opcionalmente, si se omite, los parámetros restantes se tratan como el comando (con parámetros) para comenzar.

Entonces, la última llamada que estoy usando ahora en nuestro script de inicio es:

START "MongoDB" database\console-wrapper.exe --width=140 --height=70 %~dp0database\mongodb\bin\mongod.exe --dbpath %~dp0database\data --rest

La ventana resultante tendrá el tamaño solicitado y al presionar Ctrl+ C, la ventana se cerrará (después de haber cerrado correctamente el proceso contenido).

Der Hochstapler
fuente
6

¿Has considerado ejecutarlo desde un script de PowerShell? Powershell es capaz de cambiar el tamaño de su propia ventana

$h = Get-Host
$buf = $h.UI.RawUI.BufferSize
$buf.Width = 300
$h.ui.rawui.BufferSize = $buf
$win = $h.UI.RawUI.WindowSize
$win.Width = 150
$h.ui.rawui.WindowSize = $win
#Command to start mongodb here.

Esto crea una ventana con un tamaño de 150 pero también tiene un búfer de desplazamiento lateral de 300.

Scott Chamberlain
fuente
Sí, lo consideré, pero no sabía cómo implementarlo en ese momento. Esto funciona perfectamente, excepto por la ligera molestia de que la ejecución de scripts podría estar deshabilitada.
Der Hochstapler
5

Hasta donde entiendo la pregunta, desea que MongoDB tenga el tamaño especificado de la ventana de la consola y salga cuando presione Ctrl+ C. Entonces la respuesta es bastante simple: use el atajo para iniciarlo.

No tengo mongodejecutable, así que lo usaría perl.execomo ejemplo. Cuando lo inicia desde el cuadro de diálogo Ejecutar ( Windows+ R), el tamaño de la ventana de la consola sería estándar 80 × 25 con un tamaño de búfer para 300 líneas.

  1. Crear un acceso directo a mongod(o perlen mi caso).
  2. Haga clic derecho en el acceso directo y haga clic en Propiedades .
    1. En la pestaña Acceso directo en el campo Destino , agregue parámetros a mongod.
    2. Iniciar en campo controla el directorio actual inicial del programa iniciado. Por defecto será el directorio donde se encuentra .exe.
  3. Haga clic en la pestaña Diseño .
    1. Cambiar el tamaño de la ventana a 140 × 70.
      Propiedades de acceso directo, pestaña Diseño
    2. Puede aumentar el tamaño del búfer Altura de pantalla a 1000 o más para poder desplazarse hacia arriba a los mensajes más antiguos.
    3. Si borra la ventana Permitir posición del sistema , puede especificar la ubicación de la ventana de la consola en la pantalla.
  4. Haga clic en Aceptar para cerrar las propiedades de acceso directo.

Ahora, cuando hace clic en este acceso directo, la ventana de la consola tendrá el tamaño especificado. Cuando presiona Ctrl+ C, la aplicación se cierra y la ventana se cierra sin avisos adicionales.


También puede cambiar el diseño de la ventana después de iniciarla desde el cuadro de diálogo Ejecutar . Haga clic con el botón derecho en el título de la ventana de la consola y haga clic en Propiedades . Haga clic en la pestaña Diseño , ajuste el tamaño de la ventana y haga clic en Aceptar para cerrar las propiedades y aplicar los cambios de inmediato. (Si la ventana se inició desde el acceso directo, las propiedades del acceso directo se actualizan).

La próxima vez que inicie la misma aplicación, el tamaño de la ventana de la consola será mágicamente del mismo tamaño. (No lo he comprobado esta vez, pero solía funcionar).

Alexey Ivanov
fuente
La ubicación de mongod.exeno es fija. Cambiará según la implementación de la aplicación. Es por eso que estaba buscando una solución a través de la consola directamente. Cuando pongo una ruta relativa en el destino o en los campos del directorio de trabajo para un acceso directo, no los aceptará :(
Der Hochstapler
@OliverSalzburg ¿Intentó el enfoque de reiniciar el lote ? Me refiero a que su lote comienza por sí mismo start cmd /ky pasa un parámetro adicional o establece una variable de entorno. La segunda instancia cambia el tamaño de la ventana de la consola y comienza mongod.exe.
Alexey Ivanov
Sí, probé muchas cosas. Pero siempre que haya un archivo por lotes involucrado, la solución sufrirá el Terminate batch job (Y/N)?mensaje: \ En realidad, acabo de terminar de implementar una aplicación de contenedor para resolver esto por mí.
Der Hochstapler
@OliverSalzburg Será una utilidad muy útil. También pensé que un envoltorio sería la única forma ...
Alexey Ivanov
3

La configuración de diseño de la consola predeterminada se encuentra aquí en el registro:

[HKEY_CURRENT_USER\Console]

Puede modificar esta configuración y se aplicará a TODAS las ventanas de comandos que se inicien, independientemente de la ruta. Desafortunadamente, los valores en bruto no son amigables con los humanos.

Para configurarlos de la manera que desee, abra una ventana de cmd normal, luego edite la configuración a su gusto. Busque en el registro la ruta anterior y debería ver una subclave en "Consola" para cmd.exe. Exporte esa clave a un archivo, cambie la ruta a la anterior e importe, o simplemente copie manualmente los valores de uno a otro. Luego puede eliminar la entrada específica cmd.exe. Ahora, todas las ventanas de comandos que se abren usarán los valores predeterminados modificados.

Me ha resultado útil crear un par de archivos de entrada de registro con mis valores predeterminados estándar para que pueda abrirlos fácilmente en un nuevo servidor cuando RDP por primera vez. Hice ajustes preestablecidos para los dos tamaños que uso habitualmente.

Para 1024 x 768 (lo uso para servidores a los que normalmente se accede mediante una herramienta RDP de múltiples sesiones):

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Console]
"ScreenBufferSize"=dword:012c0050
"WindowSize"=dword:00190050
"WindowPosition"=dword:000a000a
"FontSize"=dword:000c0007
"FontFamily"=dword:00000030
"FontWeight"=dword:00000190
"FaceName"="Terminal"
"QuickEdit"=dword:00000001

Para 1280 x 1024:

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Console]
"ScreenBufferSize"=dword:0bb800af
"WindowSize"=dword:004b00af
"WindowPosition"=dword:000a000a
"FontSize"=dword:000c0007
"FontFamily"=dword:00000030
"FontWeight"=dword:00000190
"FaceName"="Terminal"
"QuickEdit"=dword:00000001
Peter
fuente
0

Ponga el Startcomando delante de llamar a mongodb. Creo que eso debería solucionarlo.

Keltari
fuente
No, eso abre MongoDB en una nueva ventana de consola. Cuando lo use start /b, dejará la ventana de la consola abierta después de presionar Ctrl + C.
Der Hochstapler
0

Si está contento de ejecutar un archivo por lotes junto con un par de pequeños programas de ayuda, publico una solución completa aquí:
¿Cómo puede un archivo por lotes ejecutar un programa y establecer la posición y el tamaño de la ventana?

Contenido como abajo. . . .

Este archivo por lotes de demostración ejecutará un programa de línea de comandos y establecerá la posición y el tamaño de la ventana de la consola del símbolo del sistema. El tema general de este lote es el mismo que las dos soluciones anteriores (en la página de desbordamiento de pila en el enlace de arriba), pero hubo algunos problemas y soluciones únicas para que esto funcione: esta es una ventana del símbolo del sistema alojada por 'CMD .EXE 'y no una ventana GUI como' EXPLORER.EXE '.

Lea todos los comentarios y la descripción en el archivo por lotes para obtener más información.

Herramientas utilizadas:
1.   MonitorInfoView  por Nir Sofer (41 KB)
2.   NirCmd  por Nir Sofer (43 KB)
3.   GetPIDs  por Daniel Scheibli (280 KB)
4.   upx.exe  --- es el programa de línea de comandos que utilizaremos para esta demostración; colóquelo en el mismo directorio que el archivo por lotes.
5. Un archivo por lotes --- ver más abajo

Reúna los cinco archivos en un directorio. Este es el archivo por lotes, listo para ejecutarse en cualquier sistema Windows.

Lo que hará este lote de demostración, además de presentarle una ventana de consola personalizada, se ejecutará upx.execon los interruptores de la línea de comandos--best -v -o getpids-compressed.exe getpids.exe. Vamos a comprimir nuestra herramienta 'GetPIDs' hasta 88 KB ........ Después de iniciar, haga doble clic en la barra de título de esta ventana de consola para ver un fenómeno interesante; ¡esta ventana de consola se comporta como una GUI!

@echo off
setlocal enabledelayedexpansion enableextensions
pushd %~dp0%

REM ----- ADD SOME USEFUL INFORMATION TO THIS CONSOLE WINDOW TITLE.
for /f "tokens=3" %%A in ('getpids.exe') do set _PROCESS_ID_=%%A
title This batch file runs a command-line program and sets the position and size of its console window        (PROCESS ID = %_PROCESS_ID_%)

REM ********************** DESCRIPTION ************************************
REM ** This script opens a command-line program console window with specified
REM ** screen properties at the primary monitor (containing the taskbar).
REM ** The "X/Y position" and "W/H size" of the console window is auto-set by
REM ** this script and the monitor resolution is auto-calculated to suit.
REM ** 'MonitorInfoView.exe' is the helper tool used to capture the resolution
REM ** info of the monitor.
REM ** 'nircmd.exe' is the tool performing all the display trickery.
REM ** 'getpids.exe' is the helper tool used to capture the Process ID of the
REM ** working batch file, thus allowing us to identify which CMD.EXE host this
REM ** console window belongs to when looking at Task Manager.
REM **
REM ** To tweak this script, go to the code section named:
REM ** >>>>> USER INPUT/PREFERENCES ARE ALL SET HERE <<<<<
REM ***********************************************************************

REM ----- CLEAR ANY PREVIOUS JOB OUTPUTS IF THEY EXIST
if exist ~TMP.TXT type NUL > ~TMP.TXT

REM ----- OUTPUT THE PRIMARY MONITOR INFORMATION TO A TEXT FILE
MonitorInfoView.exe /hideinactivemonitors 1 /stext ~TMP.TXT

REM ----- ISOLATE THE RESOLUTION LINE, REMOVING ALL THE OTHER LINES IN THE TEXT FILE
for /f "delims=" %%A in ('type "~TMP.TXT" ^|find.exe /i "Maximum Resolution"') do echo %%A>~TMP.TXT

REM ----- GET THE RESOLUTION NUMBERS, AND SET THEM AS VARIABLES
for /f "tokens=3,4 delims=:X " %%A in ('type "~TMP.TXT"') do set _SCREENW_=%%A& set _SCREENH_=%%B


REM >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
REM >>>>>>>>>> USER INPUT/PREFERENCES ARE ALL SET HERE [BEGIN] <<<<<<<<<<<<

REM ----- ----------------------------------------
REM ----- |COMMAND-LINE PROGRAM TO BE RUN:  FILE NAME (WITH EXTENSION)
REM ----- |
REM ----- | |IF PROG TO BE RUN IS 'CMD.EXE' (WINDOWS COMMAND PROCESSOR)
REM ----- | |ALSO READ THE NEXT COMMENTS ABOUT SETTING SWITCHES   

    set _MYPROGRAM_=upx.exe

REM ----- ----------------------------------------   
REM ----- |COMMAND-LINE PROGRAM TO BE RUN:  SWITCHES (TO BE PASSED TO THE PROGRAM)
REM ----- |
REM ----- | |YOU CAN LEAVE THIS VARIABLE WITH A BLANK VALUE IF RUNNING THE PROG WITHOUT ANY PARAMETERS
REM ----- | | 
REM ----- | | |IF THE VALUE CONTAINS THE CHARS  '|'  OR  '<'  OR  '>'  THIS BATCH WILL FAIL TO RUN !!!
REM ----- | | |
REM ----- | | | |YOU CAN APPEND EXTRA TEXT TO THE END OF THE COMMAND BY USING THE AMPERSAND CHARACTER '&'
REM ----- | | | | EXAMPLES:
REM ----- | | | | set _MYPROGRAMSWITCHES_=dir "%systemroot%\system32" /a/o/s/4 & this text will be ignored; useful for adding some inline comments.
REM ----- | | | | set _MYPROGRAMSWITCHES_=dir "%systemroot%\system32" /a/o/s/4         & this works too, and the extra blank spaces will also be ignored.
REM ----- | | | | 
REM ----- | | | | |IF PROG TO BE RUN IS 'CMD.EXE' (WINDOWS COMMAND PROCESSOR), PATH ARGUMENTS MUST POINT TO A SPECIFIC LOCATION
REM ----- | | | | |AND BE ABSOLUTE OR INCLUDE ENVIRONMENT VARIABLES, AND ALWAYS ENCLOSE PATHS IN QUOTES.
REM ----- | | | | | EXAMPLES:
REM ----- | | | | | set _MYPROGRAMSWITCHES_=type "C:\Folder With Spaces\File.txt"
REM ----- | | | | | set _MYPROGRAMSWITCHES_=type "C:\FolderWithoutSpaces\File.txt"
REM ----- | | | | | set _MYPROGRAMSWITCHES_=type "%SYSTEMROOT%\..\Folder With Spaces\File.txt"
REM ----- | | | | | set _MYPROGRAMSWITCHES_=type "%SYSTEMROOT%\..\FolderWithoutSpaces\File.txt"
REM ----- | | | | | set _MYPROGRAMSWITCHES_=type %0                                       <<<<<<<this batch file (quotes are optional; the only exception to the rule)
REM ----- | | | | | set _MYPROGRAMSWITCHES_=type "%~dp0%\..\File.txt"                     <<<<<<<goes back one Dir from this batch file
REM ----- | | | | | set _MYPROGRAMSWITCHES_=type "%~dp0%\..\SomeFolder\File.txt"          <<<<<<<goes back one Dir from this batch file and then forwards into "SomeFolder"
REM ----- | | | | | set _MYPROGRAMSWITCHES_=dir "%systemroot%\system32" /a/o/s/4          <<<<<<<displays directory listing of the System folder. NOTE: 'dir' by itself and
REM ----- | | | | |                                                                                without a specific path argument will resolve to the folder of this batch file.

    set _MYPROGRAMSWITCHES_=--best -v -o getpids-compressed.exe getpids.exe      &// original is 280 KB, will compress down to 88 KB

REM ----- ----------------------------------------
REM ----- |COMMAND-LINE PROGRAM TO BE RUN:  DIRECTORY PATH (OF THE PROGRAM)
REM ----- | 
REM ----- | |YOU CAN LEAVE THIS VARIABLE WITH A BLANK VALUE IF THE PROG IS AT SAME LOCATION AS BATCH
REM ----- | |THIS VARIABLE WILL BE IGNORED IF THE PROG IS 'CMD.EXE'
REM ----- | | 
REM ----- | | EXAMPLES:
REM ----- | | set _MYPROGRAMDIR_=.\                               <<<<<<<relative path, program and batch in same directory
REM ----- | |                                                                  dot backslash *OR* dot (trailing backslash is optional).
REM ----- | | set _MYPROGRAMDIR_=%dp0%                            <<<<<<<relative path, program and batch in same directory
REM ----- | |                                                                  same locatiion as previous but using environment variable.
REM ----- | | set _MYPROGRAMDIR_=..\                              <<<<<<<relative path, program is back one directory from batch
REM ----- | |                                                                  dot dot backslash *OR* dot dot (trailing backslash is optional).
REM ----- | | set _MYPROGRAMDIR_=%dp0%\..                         <<<<<<<relative path, program is back one directory from batch
REM ----- | |                                                                  same as location as previous but using environment variable.
REM ----- | | set _MYPROGRAMDIR_=%SYSTEMROOT%\..\My Utilities     <<<<<<<relative path, program is back one directory from the Windows folder
REM ----- | |                                                                  and then forwards into the folder 'My Utilities'
REM ----- | | set _MYPROGRAMDIR_=C:\My Utilities\                 <<<<<<<absolute path, enclosing quotes are optional; trailing backslash is optional
REM ----- | |                                                                  same location as previous

    set _MYPROGRAMDIR_=

REM ----- ----------------------------------------
REM ----- |SET THE WANTED DIMENSIONS OF THIS CONSOLE WINDOW

    set /a _WINW_=(%_SCREENW_% / 2) + 250
    set /a _WINH_=(%_SCREENH_% / 2) + 150
    set /a _WINX_=(%_SCREENW_% - %_WINW_%) / 2
    set /a _WINY_=(%_SCREENH_% - %_WINH_%) / 2

REM ----- ----------------------------------------
REM ----- |STYLE THIS CONSOLE WINDOW   !!!IMPORTANT!!!
REM ----- |
REM ----- | |IF WE DO NOT USE THE 'MODE' COMMAND HERE ALONG WITH ITS 'COLS/LINES' VALUES THEN
REM ----- | |THE POSITIONING/SIZING OF THIS WINDOW BY 'NIRCMD.EXE' FURTHER DOWN WILL NOT WORK !!!
REM ----- | |
REM ----- | | |SOME COMMANDS WILL OUTPUT A LOT OF LINES AND AND THE CONSOLE DISPLAY WILL BE TRUNCATED
REM ----- | | |RUN THIS FOR AN EXAMPLE=====>   cmd.exe dir "%systemroot%\system32" /a/o/s/4   <=====
REM ----- | | |TO SOLVE THIS PROBLEM, SET THE 'LINES' VALUE OF 'MODE' TO A VERY HIGH NUMBER
REM ----- | | |THE MAXIMUM NUMBER IS 32000 (ON MY SYSTEM); 'MODE' WILL BE IGNORED IF THE NUMBER IS HIGHER !!!   

    color 0A
    mode.com con:cols=%_SCREENW_% lines=10000

REM ----- ----------------------------------------
REM ----- |DELETE THE TEMP TEXT FILE MADE BY 'MonitorInfoView.exe'
REM ----- |COMMENT OUT THE LINE IF YOU DON'T CARE ABOUT DELETING IT

    del /f /q ~TMP.TXT 2>nul >nul

REM >>>>>>>>>> USER INPUT/PREFERENCES ARE ALL SET HERE [END] <<<<<<<<<<<<<<
REM >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<


REM ----- RUN THE TASK . . .
nircmd.exe win setsize foreground %_WINX_% %_WINY_% %_WINW_% %_WINH_%
popd

if not defined _MYPROGRAMDIR_ set _MYPROGRAMDIR_=%~dp0
if "!_MYPROGRAMDIR_!" == "." set _MYPROGRAMDIR_=%~dp0
if "!_MYPROGRAMDIR_!" == ".\" set _MYPROGRAMDIR_=%~dp0
pushd %_MYPROGRAMDIR_%
if not exist %_MYPROGRAMDIR_% goto _SKIP_
set _CONVERT_PATH_="%CD%"
set _CONVERT_PATH_=%_CONVERT_PATH_:"=%
set _MYPROGRAMDIR_=%_CONVERT_PATH_%
:_SKIP_
popd

echo ===============================================================================
echo PROGRAM ..............: !_MYPROGRAM_!
if "!_MYPROGRAM_!"=="cmd.exe" (echo PROGRAM DIR ..........: %SYSTEMROOT%\system32) else (echo PROGRAM DIR ..........: !_MYPROGRAMDIR_!)
echo PROGRAM SWITCHES .....: !_MYPROGRAMSWITCHES_!
echo ===============================================================================

if "!_MYPROGRAM_!"=="cmd.exe" (goto _PROGRAM_IS_CMD_) else (goto _PROGRAM_IS_OTHER_)

:_PROGRAM_IS_CMD_
cd /d "%SYSTEMROOT%\system32"
!_MYPROGRAMSWITCHES_!
echo. & echo. & echo.
goto _END_

:_PROGRAM_IS_OTHER_ 
cd /d "!_MYPROGRAMDIR_!"
if "%CD%\!_MYPROGRAM_!" == "%CD%\" goto _ERRORMESSAGE_
if not exist "%CD%\!_MYPROGRAM_!" goto _ERRORMESSAGE_
"!_MYPROGRAMDIR_!\!_MYPROGRAM_!" !_MYPROGRAMSWITCHES_!
echo. & echo. & echo.
goto _END_

:_ERRORMESSAGE_
cls
color 4F
echo ===============================================================================
echo PROGRAM ..............: !_MYPROGRAM_!
echo PROGRAM DIR ..........: !_MYPROGRAMDIR_!
echo PROGRAM SWITCHES .....: !_MYPROGRAMSWITCHES_!
echo ===============================================================================
echo                        ^^!^^!^^!  E R R O R  ^^!^^!^^!
echo.
echo The program has failed to run; the path set by the above values does not exist.
echo Please exit this window and check the values you have set in this batch file.
echo.
echo This batch file is located here:
echo %0
echo. & echo. & echo. & echo. & echo.

:_END_

REM ----- CLEAR VARIABLE VALUES FROM MEMORY . . .
set _PROCESS_ID_=
set _SCREENW_=
set _SCREENH_=
set _MYPROGRAM_=
set _MYPROGRAMSWITCHES_=
set _MYPROGRAMDIR_=
set _WINW_=
set _WINH_=
set _WINX_=
set _WINY_=
set _CONVERT_PATH_=

REM ----- STOP THIS CONSOLE WINDOW FROM CLOSING   !!!IMPORTANT!!! . . .
REM ----- |
REM ----- | http://superuser.com/questions/306167/how-to-prevent-the-command-prompt-from-closing-after-execution
REM ----- | | by 'kitsu.eb' (April 26, 2014)
REM ----- | | | "My solution (just tested on Win7) is to add CMD as the last line in the batch file.
REM ----- | | |  This runs a nested command prompt that inherits the environment of its parent.
REM ----- | | |  That child shell holds the batch process open until you EXIT, at which point the
REM ----- | | |  batch has no child processes and also exits."
REM ----- | Comment . . .
REM ----- | | by me
REM ----- | | | "This is a workaround. You can't use PAUSE as the last command to stop this window from closing
REM ----- | | |  because the window will terminate after you press a key. While this batch is running, if you open
REM ----- | | |  Task Manager/Process Hacker/Process Explorer you will see an extra CMD.EXE child process running
REM ----- | | |  under the parent CMD.EXE of this batch file."
cmd.exe
derty2
fuente
Estaría perfectamente bien copiar los contenidos relevantes aquí también.
slhck